【问题标题】:Do I need duplicate test methods; 1 for unit and 1 for integration tests?我需要重复的测试方法吗? 1个单元和1个集成测试?
【发布时间】:2013-01-30 20:07:04
【问题描述】:

我是单元测试的新手,我发现的大部分信息似乎都在单元测试方面。我已经很好地掌握了这一点,并计划将 MS Test Framework 与 Moq 一起使用,因此我不必为我的单元测试依赖项手动滚动任何模拟。

假设我有以下 unit 测试方法:

[TestMethod]
public void GetCustomerByIDUnitTest()
{
   //Uses Moq for dependency for getting customer to make sure 
   //ID I set up is same one returned to test in Assertion
}

我是否必须创建另一个相同的测试来代替使用实际的实体框架和数据库调用来进行集成测试?

[TestMethod]
public void GetCustomerByIDIntegrationTest()
{
   //Uses actual repository interface for EF and DB to do integration testing
}

出于这个问题的目的,请留下关于 TDD 或 BDD 的主题;我很容易确定我是否需要(2)单独的测试以及组织这些测试的方式。在进行单元测试和集成测试时,这是一个要求吗?

谢谢!

【问题讨论】:

  • 这不是编程问题。这是一个工具使用问题。

标签: c# unit-testing moq integration-testing


【解决方案1】:

在我看来,这在某种程度上是情境性的。如果我正在处理一个小型个人项目,那么不,我只是进行单元测试。

如果是公司/企业项目,那么我确实倾向于同时进行单元测试和集成测试。但是,请将单元测试和集成测试分开。开发人员应该能够频繁且快速地运行单元测试。集成测试可以不那么频繁地运行,因为它们通常需要很长时间才能运行。通常我只在提交之前运行一次集成测试,而我更频繁地运行单元测试。


作为附加说明,请让您的测试名称说明应该发生的情况。测试名称GetCustomerByIDUnitTest 真的没有告诉我太多。更好的是:GetCustomerByID_ReturnsTheCorrectUser_WhenAValidIdIsPassed 和相反的GetCustomerByID_ReturnsNull_WhenNonExistantIdIsPassed

我倾向于使用What_Does_When 命名约定,但这也是个人喜好。一般来说,越解释越好。

【讨论】:

  • 是的,命名的好点。我在写的时候就知道它有点弱,因为我已经读过很多了。我只是想快速伪造一些东西,但我本可以做得更好。关于您的回答的问题 - 您是否在 VS.NET 中实际制作了单独的“测试”项目?如果是,您通常使用什么命名?还是您只是在单个测试项目中按文件夹分隔测试类型(即“单元测试”文件夹和“集成测试”文件夹)?
  • 我通常会制作 2 个单独的测试项目,命名为 MyProject.TestsMyProject.IntgTests,因为大多数测试运行程序在你只给他们 1 个程序集运行时运行良好,它会运行它找到的所有测试。
【解决方案2】:

嗯,我希望我不会因为提及您不愿提及的事情而让您失望。但这里我的 2 美分就可以了。预先声明一份免责声明。我使用nunitRhinoMocks,所以语法可能不同,但概念是相同的。

是的,您需要单独的测试。您可以讨论是否要将测试存储在同一个测试类中,并用[Category("integrationtest")] 标记它们,这样您就可以在不运行集成测试的情况下轻松运行单元测试,反之亦然。根据您的 TDD 实践(哎呀,我知道您不想让我谈论那个 :))您需要尽快完成单元测试。

从稍微不同的角度来看这个;你并没有真正复制你的测试。您的集成测试验证功能,而您的单元测试单独验证方法。所以他们很可能有完全不同的名字。只要它们对您有意义(或者如果您与团队一起开发某些东西:只要它对您的团队有意义)。

我认为最重要的是找到适合自己的方法。真的没有对错之分。我认为你正在编写单元测试和集成测试是一个很大的优势。你如何组织它们取决于你。在我参与的不同项目中,我有不同的方法:

项目A:

  • 1 个用于集成测试的测试类
  • 1 个用于单元测试的测试类

这有助于为测试类创建有意义的名称,它们可以捕获我们正在测试的实际功能。至于单元测试,测试类与我们正在测试的类同名。

项目 B:

  • 在一个测试类中混合了集成测试和单元测试。

这也很好用,尽管我们有时确实很难找到集成测试。但是,在你身边有更锐利的人,这有多难:)。

【讨论】:

    【解决方案3】:

    据我所知,您应该有单独的 UnitTesting 和 IntegrationTesting 项目。 This book 的建议是创建两个项目并将它们命名为ProjectName.UnitTestsProjectName.IntegrationTests。 开发人员必须单独且轻松地运行它们中的每一个。

    你可以找到很多关于测试的有趣话题和视频here

    【讨论】:

    • 我对该链接感兴趣,但您介意发布一些适用于我的问题的特定链接,而不是博客主页吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多