SQL Server单元测试存储过程 - 生成测试数据

4
我正在为一个保留大量存储过程、表和外键的数据库编写VS2012上2008R2的存储过程单元测试。
对于每个存储过程测试,我会在执行测试之前在相关表中生成少量数据。
但我已经意识到这种做法会使测试非常敏感,特别是对于添加非空列或额外键等数据库更改。
这些更改的级联影响可能会导致必须保持大量测试同步。有些测试甚至与特定更改无关,但共享一个或多个相关表,因此在准备阶段失败。
此外,这种做法的一个相当不方便的后果是很难区分测试条件失败和准备期间键违规失败之间的差异。
从大规模考虑,工作时间后果可能会很严重。
到目前为止,我发现有关此主题的所有内容都太过笼统了。
现在的问题是:存在相关最佳实践来解决开发数据库中的测试数据与在测试中生成测试数据的问题吗?
1个回答

3
我一直在尝试使用VS2012编写单元测试,但发现它非常有限和繁琐。受到你的问题的触发,我刚刚对tSQLt进行了一些阅读,这是我听说过的更强大的测试框架。例如,它可以模拟表、存储过程等。这样可以减少依赖性,从而最小化数据库更改的级联影响。
即使您仍然希望在VS2012中编写单元测试,您也可以使用模拟功能。只需确保在事务中运行测试。
网站上的示例测试:
CREATE PROCEDURE SalesAppTests.[test SalesReport returns revenue and commission]
AS
BEGIN
-------Assemble
    EXEC tSQLt.FakeFunction 'SalesApp.ComputeCommission', 'SalesAppTests.Fake_ComputeCommission';
    EXEC tSQLt.FakeTable 'SalesApp.Employee';
    EXEC tSQLT.FakeTable 'SalesApp.Sales';

    INSERT INTO SalesApp.Employee (EmployeeId) VALUES (1);
    INSERT INTO SalesApp.Sales (EmployeeId, SaleAmount) VALUES (1, 10.1);
    INSERT INTO SalesApp.Sales (EmployeeId, SaleAmount) VALUES (1, 20.2);

-------Act
    SELECT EmployeeId, RevenueFromSales, Commission
      INTO SalesAppTests.Actual
      FROM SalesApp.SalesReport;

-------Assert
    SELECT TOP(0) *
      INTO SalesAppTests.Expected
      FROM SalesAppTests.Actual;

    INSERT INTO SalesAppTests.Expected (EmployeeId, RevenueFromSales, Commission) 
      VALUES (1, 30.3, 1234.5678);

    EXEC tSQLt.AssertEqualsTable 'SalesAppTests.Expected', 'SalesAppTests.Actual';
END;
GO

谢谢你的回答。我也尝试过tSQLt。它允许我们伪造一个没有标识列的表,但我不确定这是否解决了核心问题。我想我需要再做一些实验。 - Laslo Katai-Pal
有很多选项可供选择,例如:"[@Identity=] '保留标识' - 表示是否应保留标识列的标识属性。如果 @Identity=1,则将保留标识属性;否则,虚假表将删除标识属性。默认值为 @Identity=0。" - MWillemse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接