C# 如何区分测试类中的单元测试和集成测试?

C# 如何区分测试类中的单元测试和集成测试?,c#,nunit,C#,Nunit,我的问题与此类似:。然而,我的问题是NUnit,而不是JUnit。在测试类中区分单元测试和集成测试的最佳方法是什么?我希望能做这样的事情: [TestFixture] public class MyFixture { [IntegrationTest] [Test] public void MyTest1() { } [UnitTest] [Test]

我的问题与此类似:。然而,我的问题是NUnit,而不是JUnit。在测试类中区分单元测试和集成测试的最佳方法是什么?我希望能做这样的事情:

[TestFixture]
    public class MyFixture
    {
        [IntegrationTest]
        [Test]
        public void MyTest1()
        {
        }

        [UnitTest]
        [Test]
        public void MyTest1()
        {
        }
    }

有没有办法用NUnit做到这一点?是否有更好的方法对此进行打点?

类别属性可能会帮助您完成此操作


就我个人而言,我发现最好将它们放在单独的组件中。您可以使用约定,例如name.Integration.Tests和name.Tests(或您的团队喜欢的任何约定)


对于TeamCity这样的CI服务器,程序集或属性都可以正常工作。属性方法的痛苦往往表现在IDE测试运行者身上。我希望能够快速运行我的单元测试。使用单独的程序集很容易-选择适当的测试项目并运行测试。

不要将它们放在同一个类中,或者将它们拆分为测试程序集中的文件夹,或者将它们拆分为两个单独的测试程序集


从长远来看,这将更容易管理,特别是如果您使用诸如NCrunch之类的工具。

此答案与其他一些答案分享了一些细节,但我想从稍微不同的角度来回答这个问题

TestFixture的设计使得每个测试都得到相同的设置。要正确使用TestFixture,您应该以这样一种方式划分测试,即具有相同设置的所有测试最终都位于相同的测试类中。这就是几乎每一个xunit框架都是为了使用而设计的,当您使用软件时,您总是能够获得更好的结果

由于集成和单元测试不太可能共享相同的设置,这自然会导致将它们放在一个单独的类中。通过这样做,您可以将所有集成测试分组到一个名称空间下,使它们易于独立运行


更妙的是,正如另一个答案所建议的那样,将它们放在一个单独的组件中。这在大多数CI构建中工作得更好,因为集成测试的失败可能更容易与集成测试的失败区分开来。另外,使用单独的程序集消除了使用类别或特殊属性的所有复杂性。

我做了类似的事情。我创建了两个属性来设置测试的类别,这允许我分离单元和集成tests@Nkosi,我想没有内置属性?它对你有帮助吗?对我来说很有用。没有内置的方式,所以我创建了我的own@Nkosi,在同一个测试类中是否有单元测试和集成测试?它们在一起时是否工作得更好?我可以问一下系统的大小吗?我正在尝试确定这是否适用于大型企业应用程序,或者它是否只会引入不必要的复杂性。感谢+1的组装建议。单独的名称空间使它们更容易识别,正如您所说,与外部工具集成更好;你是指不使用模拟的测试。例如,请参见此处的代码:。在我的测试中——如果我提供了:OfferType和IValueCalculator的具体实现,那么这将是一个集成测试?我想知道。当前正在使用单元类别--
xunit
-[Trait(“测试类型”、“单元”)或[Trait(“单元测试”)标记单元测试。正在考虑采用单独的组装路线,考虑在签入时运行测试。@w0051977我倾向于使用“集成测试”来表示运行缓慢或不纯净(有副作用或不确定)的任何内容。“单元”测试仍然可以同时测试几个类。
namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [TestFixture]
  public class SuccessTests
  {
    [Test]
    [Category("Unit")]
    public void VeryLongTest()
    { /* ... */ }
}