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

时间:2015-11-12 13:31:01

标签: c# visual-studio nunit moq

我正在实现一个小型API,它向服务器发送不同的请求并使用响应。我正在使用Moq和NUnit并尝试以Test First Manner实现所有内容。我试图将所有内容封装到接口中,因此我可以模拟它们,它们运行得很好。在某些时候,我的API也由QA测试真实数据(来自服务器),因为服务器也是并行开发的,有时无法分辨出错误发生在哪里。因此,我刚刚编写了一个测试类,其中包含一些单元测试,基本上只是将请求发送到服务器并检查是否有响应返回。这样的事情:

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

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

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

我知道这是违反单元测试的原则,因为它们应该完全独立于彼此进行测试,但我想知道是否有办法让它们相互依赖(通过返回值)这样我就可以创建作为实际用例的测试类。如果可能的话,我希望每个测试类都有一个用例。

1 个答案:

答案 0 :(得分:1)

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

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

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

NUnit限制:

  • 您无法强制执行订单。您在一个工具中看到的任何订单都不能保证在另一个工具中的工作方式相同(我在实践中看到了这一点)。一些单元测试运行器按字母顺序排序,其他单元测试运行器保持在类中定义的顺序。
  • 您不能让测试相互依赖。出于与子弹一样的原因。

NUnit和任何XUnit样式单元测试框架(JUnit等)在这一点上都非常自以为是。驱动单元测试的设计约束是:

  • 单元测试必须一致隔离原子(但不耐用)。即任何一个单元测试必须能够独立运行,每次产生相同的结果,并且不得依赖或影响任何其他单元测试。

一些单元测试框架非常努力地确保满足这些要求,甚至动态加载DLL,运行测试,卸载它,并使用新的类加载器重复,以确保静态值不会影响其他测试

我担心你必须在你的设置中做很多工作并拆除以使单元测试按照你想要的方式运行。您甚至可能必须人为地将测试分成不同的类,以确保按照您期望的顺序发生正确的事件序列。

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