【问题标题】:Running same NUnit tests with different objects使用不同的对象运行相同的 NUnit 测试
【发布时间】:2013-08-02 16:42:27
【问题描述】:

有没有办法对多个对象运行一组相同的测试,但根据所述对象的类型切换每个测试?

即如果我有课

abstract class  MyObj{  abstract bool DoWork(bool isTrue);                 }
class SubObj1 : MyObj{  override bool DoWork(bool IsTrue){return IsTrue; } }
class SubObj2 : MyObj{  override bool DoWork(bool IsTrue){return false;  } }

和测试

class Tests
{
    [Test]
    void Test1()    {   Assert.IsTrue(new SubObj1().DoWork(true))   }
    [Test]
    void Test2()    {   Assert.IsTrue(new SubObj1().DoWork(false))  }
}

我希望能够使用标志、类型检查或其他功能,以便我:

  • 可以用MyObj 实例替换对SubObj1 的引用,
  • SubObj1SubObj2 上运行Tests 类,但如果使用SubObj2 实例,则阻止Test1 运行? 编辑: 这部分可以通过Assert.Ignore 完成。

(我的代码中的真实案例涉及三个不同的非结构化数据解析器,每个解析器都以不同的方式以简单性换取准确性。我有一个解析器的 400 个测试用例,并希望将它们移植到其他两个。创建三个几乎相同的测试用例集并修剪在每个类中不起作用的测试似乎是一个巨大的 DRY 失败。)

【问题讨论】:

    标签: nunit


    【解决方案1】:

    您可以使用TestCaseSourceAttribute 轻松完成。比如:

    class Tests
    {
        static object[] TestCases = new object[] 
           {
               new object[] { new SubObj1(), true }
               new object[] { new SubObj2(), false}
           };
    
        [Test, TestCaseSource("TestCases")]
        void Test1(MyObj obj, bool isTrue)    {   Assert.IsTrue(obj.DoWork(isTrue))   }
    }
    

    (我没有尝试编译它,只是分享了基本思想)。

    【讨论】:

    • 谢谢。 a) 这会在 NUnit 中显示为多个测试用例吗? (即我可以使看起来像是 Test1_1、Test1_2 等,或类似的东西吗?)
    • 测试名称看起来确实不同。你会看到类似:Namespace.TestClassName.Test_Method_Here("and TestCase string here")
    • 这实际上取决于单元测试运行器。我记得 R# 会将它们显示为单独的测试,但我不记得默认的 VS 单元测试运行器是如何显示它们的。
    猜你喜欢
    • 2022-12-12
    • 2011-08-28
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多