tSQLt 简单 SELECT 语句 - 我需要什么测试?最佳实践

tSQLt simple SELECT statement - what tests do I need? Best practice

这是一个关于 tSQLt / SQL 测试最佳实践的问题。

假设我有一个存储过程 returns 一个简单的 SELECT 语句的结果,例如

SELECT
    A.Column1
,   B.Column2
FROM
    TableA AS A
INNER JOIN
    TableB AS B
ON
    A.ID = B.ID
    ;

我在想tSQLt测试要写什么。最明显的测试是我在两个表中都有记录(具有匹配的 ID)和过程 returns 正确的数据。

那个测试够了吗?可能不会,因为有人可以将 INNER JOIN 更改为 LEFT JOIN,并且测试仍会通过,但存储过程的行为现在已经改变。

因此,当 TableA 或 TableB 为空,或者两个表都为空时,我是否应该测试没有返回记录?虽然我认为这更完整,但它对我来说有点矫枉过正,并且可能导致对包含 5 个或更多表的 SELECT 语句进行大量测试。

我会感谢社区的想法。

谢谢,

灰烬

不太能确保存在 INNER JOIN。因为我们不想具体说明存储过程是如何实现的。但是,我们确实希望确保存储过程的预期结果始终按预期返回。

我的测试应该是这样的:

CREATE PROCEDURE [MyTests.SimpleTests].[test Returns_SimpleTable_Successfully]
AS
BEGIN
    --Arrange
    EXEC tSQLt.FakeTable @schemaname = 'dbo', @tablename = 'TableA';
    EXEC tSQLt.FakeTable @schemaname = 'dbo', @tablename = 'TableB';

    INSERT INTO TableA (Id, Column1) VALUES (1, 'Value1'),(2, 'Value2')
    INSERT INTO TableB (Id, Column2) VALUES (1, 'Value3'),(3, 'Value4')

    CREATE TABLE Expected
    (
       Column1 NVARCHAR(255),
       Column2 NVARCHAR(255)
    )

    INSERT Expected (Column1, Column2)
    VALUES (N'Value1', N'Value3');

    --Act
    CREATE TABLE Actual
    (
       Column1 NVARCHAR(255),
       Column2 NVARCHAR(255)
    )

    INSERT Actual (Column1, Column2)
    EXEC up_SimpleTest

    --Assert
    EXEC tSQLt.AssertEqualsTable 'Expected', 'Actual'

END;

被测存储过程如下所示:

CREATE PROC up_SimpleTest
AS
BEGIN

    SELECT
        A.Column1,
        B.Column2
    FROM TableA AS A
    RIGHT JOIN TableB AS B
        ON A.Id = B.Id;

END

这意味着如果存储过程更改为 LEFT、RIGHT 或 FULL 联接。测试将失败,因为不会返回预期的数据。但是它确实允许存储过程更改为此并且仍然有效:

SELECT
    A.Column1,
    B.Column2
FROM TableA A, TableB B
WHERE A.Id = B.Id

这就是我们不应该也不能强制使用 INNER JOIN 的原因,因为关于如何实现查询还有许多其他有效方法。