【问题标题】:How to "import" NUnit tests from another assembly如何从另一个程序集中“导入” NUnit 测试
【发布时间】:2015-03-26 16:31:36
【问题描述】:

我的项目中有几个程序集,每个程序集都有一个覆盖它的测试程序集(这不能改变,所以不建议)

我有一套通用测试,我希望将其包含在每个测试程序集的测试套件中。

我已经将这些常见的测试放在他们自己的程序集中,并从每个具体的测试程序集中引用了它,但是 NUnit/ReSharper 测试运行器不会选择这些测试。

如何让 NUnit 和 ReSharper 测试运行器包含/查找每个测试程序集的这些常见测试并执行它们?

更新:目前我的通用测试和每个项目测试都简单地使用 [TestFixture] 和 [Test] 属性定义

示例

来自通用程序集的示例测试

namespace Example.Common {
    [Test]
    public void CommonTest() {
        // something that applys to all assemblies, like code analysis, obviously this is a silly example, but the contents of the test is not important. I just want this included with the other tests in the specific assemblies
        Assert.AreEqual(10, Assembly.GetExecutingAssembly().DefinedTypes.Count());
    }
}

来自项目特定程序集的示例测试:

namespace Example.Specific {
    [Test]
    public void SpecificTest() {
        // something specific to this assembly
        Assert.AreEqual("Example.Specific", Assembly.GetExecutingAssembly().GetName().Name);
    }
}

我希望将通用测试包含在

【问题讨论】:

  • 如果你能给出一个简短但完整的例子来说明你正在做什么,那么帮助会容易得多。 (例如,您使用的是SuiteAttribute 吗?)
  • @jonSkeet 我不是,虽然这似乎需要手动注册,而我宁愿避免。我意识到我可以反思,然后从套件继承,但这一切似乎都相当老套,我想我一定是错过了一些技巧
  • 好吧,当我们看不到您要做什么时,很难说您缺少什么。如果我们可以自己复制它,我们可以帮助您...

标签: c# nunit resharper


【解决方案1】:

您需要拥有CommonTest 类的派生类。仅仅引用通用测试程序集是不够的。今年早些时候,我遇到了同样的问题;我想执行几个测试,但配置不同(app.config)。最后还是同样的问题,但不幸的是,没有像[assembly: IncludeTest( typeof(CommonTest))] 这样简单的方法。那太棒了:)

【讨论】:

    【解决方案2】:

    我不确定我是否理解正确,但我会这样做:

    • 拥有一个包含所有常见测试类的库,例如:
    namespace NUnitCommon
    {
        [TestFixture]
        public class NUnitCommonTestClass
        {
            [Test]
            public void CommonTestNoOne()
            {
                Assert.IsTrue(true);
            }
        }
    }
    
    • 然后,您应该在每个“特定”测试项目中包含对这个库的引用,并让所有测试类都继承自它:
    using NUnitCommon;
    
    namespace NUnitSpecific
    {
        [TestFixture]
        public class SpecificTestClass : NUnitCommonTestClass
        {
            [Test]
            public void SpecificTestNoOne()
            {
                Assert.IsTrue(true);
            }
        }
    }
    

    这样,如果您为SpecificTestClass 运行所有测试,来自NUnitCommonTestClass 的测试也将运行。使用 ReSharper 进行测试。那是你要的吗?如果不是,请澄清。

    【讨论】:

    • 这样做很可能会导致意想不到的结果。将NUnitCommonTestClass 标记为[TestFixture] 然后允许SpecificTestClass 从它继承将允许您的测试套件多次运行基类中的所有测试。例如:如果基类有 10 个测试,而子类有 10 个测试,则将运行的测试总数是基类的 10 + 运行基类测试的子类的 10 + 子类的 10类本身 = 30 个测试。我的猜测是您希望运行 20 个测试而不是 30 个。要修复 OP 应该使基类成为抽象类。
    • @Quinn 只有当您从基类程序集和子类程序集中运行所有测试时才会发生这种情况,您可以很容易地避免这种情况。所以我真的不明白你的意思,作为另一个答案的反对票也没有提供与我相同的指导。只是为了确保 - 你是否意识到基类在它自己的程序集中,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多