2

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

假设我有以下单元测试方法:

[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)单独的测试以及组织这些测试的方式。在进行单元测试和集成测试时这是一个要求吗?

谢谢!

4

3 回答 3

3

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

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


作为附加说明,让您的测试名称解释应该发生的事情。测试名称GetCustomerByIDUnitTest真的没有告诉我太多。更好的是:GetCustomerByID_ReturnsTheCorrectUser_WhenAValidIdIsPassed反之亦然GetCustomerByID_ReturnsNull_WhenNonExistantIdIsPassed

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

于 2013-01-30T20:13:14.327 回答
1

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

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

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

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

项目一:

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

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

项目B:

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

这也很好用,尽管我们有时确实很难找到集成测试。但是,在您身边有 resharper 的情况下,这有多难:)。

于 2013-01-30T20:25:39.570 回答
0

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

您可以在此处找到许多有关测试的有趣主题和视频

于 2013-01-30T20:14:45.340 回答