将数据插入tSQLt faketable的最佳方法是什么?

3 sql tsqlt

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

为tSQLt faketable准备数据的最佳做法是什么?

谢谢.

den*_*djr 7

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

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

到那时,由于FakeTable已经删除了约束,因此您也可以自由地仅将数据插入到您关注的表的列中.这意味着您的insert语句可以更短.

你说每个表需要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;
Run Code Online (Sandbox Code Playgroud)