3

我对 tSQLt 数据库单元测试框架很陌生。我有一个使用 3 个表的存储过程。每个表需要 15 行数据。我还需要另一个假表来验证结果。但是使用 INSERT 准备假表容易出错且难以维护。

为 tSQLt faketable 准备数据的最佳实践是什么?

谢谢。

4

1 回答 1

7

这是我可以在没有代码示例的情况下得出的最佳答案:

FakeTable 的想法是让在测试期间将测试数据插入表中变得更简单。它用不包含约束的副本替换表。这样您就可以仅将数据放置在您尝试测试的存储过程、函数、视图等所使用的表中。

至此,由于 FakeTable 已经移除了约束,您还可以自由地将数据只插入您关心的表的列中。这意味着您的插入语句可以更短。

你说每个表需要 15 行数据。在编写单元测试时,我发现很少需要这么多数据来测试代码的特定位。例如,如果我正在测试一个包含非常复杂的 select 语句的存储过程,我将为该 select 语句中可能出现的各种条件编写多个测试。通过这样做,当测试失败时,我可以更轻松地隔离代码中出现问题的位置。

您还说您需要一个假表来验证结果。我假设你的意思是你需要将你正在测试的结果插入到一个表中,或者构建一个表来保存预期值。(同样,这是发布示例非常有帮助的地方)。这是我如何捕获视图结果并比较预期结果和实际结果的示例。请注意,我没有将 FakeTable 用于 Actual 或 Expected 表。

CREATE PROCEDURE MyTests.[test CustomerOrderSummary counts orders for each customer]
AS
BEGIN
  EXEC tSQLt.FakeTable 'Demo.Order';

  INSERT INTO Demo.Order (OrderId, CustId) VALUES (1, 12);
  INSERT INTO Demo.Order (OrderId, CustId) VALUES (2, 12);
  INSERT INTO Demo.Order (OrderId, CustId) VALUES (3, 12);
  INSERT INTO Demo.Order (OrderId, CustId) VALUES (4, 55);
  INSERT INTO Demo.Order (OrderId, CustId) VALUES (5, 55);

  SELECT CustId, NumOrders
    INTO MyTests.Actual
    FROM Reports.CustomerOrderSummary;

  SELECT TOP(0) *
    INTO MyTests.Expected
    FROM MyTests.Actual;

  INSERT INTO MyTests.Expected (CustId, NumOrders) 
      VALUES (12, 3);
  INSERT INTO MyTests.Expected (CustId, NumOrders) 
      VALUES (55, 2);

  EXEC tSQLt.AssertEqualsTable 'MyTests.Expected', 
                               'MyTests.Actual';
END;
于 2015-03-09T13:14:47.350 回答