使用不独立的单元测试来创建用例测试(场景测试)

Using Unit Tests which are not independent to create Use Case tests (Scenario tests)

我正在实施一个小型 API,它向服务器发送不同的请求并处理响应。我正在使用 Moq 和 NUnit 并尝试以测试优先的方式实现所有内容。我试图将所有内容封装到接口中,这样我就可以模拟它们,效果很好。在某些时候,我的 API 也由 QA 使用真实数据(来自服务器)进行测试,因为服务器也在并行开发,所以有时无法判断错误发生的位置。因此,我刚刚编写了一个带有一些单元测试的测试 class,这些单元测试基本上只是向服务器发送请求并检查是否有响应返回。类似的东西:

[Test]
    public void LoginShouldBeSuccesful()
    {
       result = webclient.UploadString(https://someURL.com, "POST", query);

       Assert.That(result,Is.Not.Null);
    }

这让我可以很容易地在 VS 中测试服务器是否已启动和 运行ning,是否某些请求已经实施和工作等等。 (而且它比使用某些浏览器 REST API 插件快)。但是,我添加了越来越多的测试,这些测试依赖于不同的 webrequests(我已经将其放入单元测试中)。因此,例如,当我想测试一个删除用户生成的数据库条目的 webrequest 时,我首先必须 运行 登录单元测试 -> 将响应(令牌)添加到 GenerateDBEntry 单元测试 -> 将 EntryID 添加到DeleteEntry 请求。

我知道这违反了单元测试的原则,因为它们应该 运行 完全独立于彼此进行测试,但我想知道是否有办法让它们排序并依赖于每个其他(通过 return 值),以便我可以创建测试 classes,它们是实际用例。如果可能的话,我希望每个测试都有一个用例 class.

我认为区分并使用最适合工作的工具很有用。看起来你描述的是规范测试,这是行为驱动设计 (BDD) 的领域。

C# BDD 测试套件的简短列表包括:

这些是围绕测试您的用例而设计的,并帮助您设计可测试的用例。关键区别在于 BDD 工具旨在确保应用程序作为一个整体按设计工作。 TDD 工具旨在确保每个部分都按设计工作。语言、术语和概念更好地支持您正在尝试做的事情。


N单位限制:

  • 你不能强加命令。您在一个工具中看到的任何顺序都不能保证在另一个工具中同样有效(我已经在实践中看到了这一点)。一些单元测试 运行 人员按字母顺序排序,而其他人则保持 class.
  • 中定义的顺序
  • 你不能让测试相互依赖。出于与第一个项目符号相同的原因。

NUnit 和任何 XUnit 风格的单元测试框架(JUnit 等)在这一点上都非常固执己见。推动单元测试的设计约束是:

  • 单元测试必须一致孤立原子(但不持久) . IE。任何一个单元测试必须能够 运行 自己,每次都产生相同的结果,并且它不能依赖或影响任何其他单元测试。

一些单元测试框架竭尽全力确保这些要求,甚至动态加载 DLL,运行 测试,卸载它,然后使用新的 class 加载程序重复只是为了确保静态值不会影响其他测试。

恐怕您必须在设置和拆卸中做很多工作才能让单元测试按照您想要的方式运行。您甚至可能不得不在不同的 class 之间人为地拆分您的测试,以确保正确的事件顺序按照您期望的顺序发生。

它只是不适合这项工作的工具。这就是我推荐 BDD 方法的原因,因为您可以使用这些工具强加顺序和依赖性。