这里的情况类似。我尚未评估“纯 RedGate”解决方案 - 但对于以 MS 为中心的商店,我会推荐
- 用于 PROD 就绪模式控制的 SQLProject(即您要发布的任何东西,放在这里)
- 仅包含tSQLt 和 tSQLt 单元测试脚本的 SQLProject
- MSTest 数据驱动测试调用 tSQLt 执行测试
在 CICD 设置中部署 PROD-ready SQLProject,然后部署 tSQLt SQLProject,然后执行 MSTest 套件。
细节
不幸的是,没有简单的方法来枚举您的开发人员可能在 TestExplorer 中作为单独项目编写的每个 tSQLt 单元测试,除非您强制他们为每个 tSQLt 测试编写 C# 代理测试(这容易出错并且重复工作),或者您利用 T4 模板(例如探测 SQL 以获取 tSQLt 测试列表,然后使用模板动态生成 MSTest 源文件),这似乎是做作和矫枉过正。
MSTest 数据驱动的测试设置起来有点麻烦,但它已记录在案,一旦完成,就不需要再次触及。
public TestContext TestContext { get; set; }
[TestCategory("Integration")]
[TestMethod]
// NOTE: DataSources should be configured as described here
// https://msdn.microsoft.com/en-us/library/ms182527.aspx
//
// NOTE: when configuring DataSource table, use tSQLt.Tests
[DataSource("MyDataSource")]
public void Test()
{
// NOTE: tSQLt.Tests returns a multi-column table, index
// as appropriate
string name = $"{TestContext.DataRow[1]}.{TestContext.DataRow[3]}";
using (SqlConnection connection = new SqlConnection(ConfigurationManager.
ConnectionStrings["MyConnectionString"].
ConnectionString))
{
connection.Open();
// NOTE: using Dapper to invoke
try { connection.Query($"exec tSQLt.Run '{name}'"); }
// NOTE: this is how we surface individual test names
// on failure
catch { Assert.Fail($"Failed tSQLt test '{name}'."); }
}
}
样本输出

替代方案和注意事项
SSDT 单元测试:我并没有真正看到这里的附加值。GUI 很笨拙,完全不直观。如果你是一个强大的 C# 开发人员,按钮和设计器是一个障碍。如果您是强大的 SQL 开发人员,那么代码隐藏和新的 IDE(VS 与 SSMS)会很痛苦。
NUnit:就表示而言,NUnit 的TestCase
属性将是最佳的,因为将 tSQLt 测试名称直接放在 TestExplorer 中而不作为单个测试的前缀将是理想的。不幸的是,我们无法进行数据驱动TestCase
。相反,我们可能只使用TestCaseSource
,它似乎用 . 格式化每个测试[TestMethodName]("[tSQLtTestName]")
。