代码之家  ›  专栏  ›  技术社区  ›  TheEdge

有什么解决方案可以在tSQLt中获得Nunit风格的TestCase()功能吗?

  •  0
  • TheEdge  · 技术社区  · 7 年前

    我目前正在寻找为一些SQL Server SQL代码编写一些单元测试,使用 tSQLt .

    阅读文档后,似乎不支持使用参数调用测试用例,而不是为每个参数组合编写单独的测试用例。 (为了回答这个问题,请将您认为将参数传递到测试用例与为每个参数组合编写单独的参数是否是一个好主意放在一边)

    例如,在 NUnit 您可以使用 TestCase 属性:

    [TestCase("", -1, false)]
    [TestCase("ACT ", 1, true)]
    [TestCase("ACT", 1, true)]
    [TestCase("aCT", 1, true)]
    [TestCase("AUSTRALIAN CAPITAL TERRITORY", 1, true)]
    [Test]
    public void DetermineStateIdFromText(string aStateText, long aExpectedStateId, bool aExpectedFound)
    {
        //Arrange
        WzDetermineStateIdFromTextInput input = new WzDetermineStateIdFromTextInput
                                                {
                                                    StateText = aStateText
                                                };
    
        //Act
        WzDetermineStateIdFromTextOutput output = _WzLocationMappingService.DetermineStateIdFromText(input);
    
        //Assert
        output.ResultSuccess.ShouldBeTrue();
        output.Found.ShouldBe(aExpectedFound);
        if (output.Found)
        {
            output.StateId.ShouldBe(aExpectedStateId);
        }
    }
    

    (测试方法的勇气是不相关的,只是为了完整性才包含在内 Shouldly 如果您想知道资产在哪里。)

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sebastian Meine T I    7 年前

    tSQLt允许使用不是测试类中的测试用例的存储过程。因此,为了实现您想要的目标,我通常创建一个存储过程来接受参数并处理所有测试逻辑。然后,我编写了一系列单行测试过程,调用传递适当参数的其他过程。在tSQLt本身的测试用例中有一些这样的例子。

    与真正的参数化测试相比,这种方法几乎没有什么缺点,但有一个很大的优点:您可以为每个案例指定一个真正有意义的名称,这将使查找问题变得更加简单。(真正的参数化测试在待办事项中,但它们不是最高优先级的,因此可能需要一段时间才能完成。)

    作为补充,我强烈建议不要自动生成测试,甚至不要为测试生成参数,因为这通常会导致更高的维护成本。由于测试的目标是降低维护代码库的成本,这会适得其反。我见过很多单元测试采用项目因为这个原因而失败。

    推荐文章