【问题标题】:How to properly reuse test code in MSTest如何在 MSTest 中正确重用测试代码
【发布时间】:2020-03-29 20:39:39
【问题描述】:

我们已经开始引入一些行为测试来尝试测试一些外部软件模块,例如一个完整的黑盒。 该测试套件是使用从基测试类继承来编写的,以便于组织。

现在我们想重用这个测试套件来测试另一个接口兼容的模块。 我们能够找到的解决方案是继承测试类,并实现另一个构造函数。 我想确认没有更好的选择,因为为每个测试套件类编写重复的继承类似乎是错误的。

[TestClass]
public class RouModel_Basic_RunnerBasic : ROUModelTest_Basic
{
    public RouModel_Basic_RunnerBasic() : base()
    {
        //init basic model here
        model = basicModel;
    }
}
[TestClass]
public class RouModel_Basic_RunnerOther : ROUModelTest_Basic
{
    public RouModel_Basic_RunnerOther() : base()
    {
        //init other model here
        model = otherModel;
    }
}

public class ROUModelTest_Basic : RouModelTest
{
   [TestMethod]
   public void TestABC() 
   {
       string input = "abc"
       var result = model.run(input);
       Assert.AreEqual("123", result);
   }
}

public class RouModelTest 
{
    protected IModelTest model;
    ...
}

【问题讨论】:

  • 我们以前曾使用带有虚拟成员的基类或额外的 Func 用于通用测试初始化​​、拆卸等,这有助于将通用逻辑隔离到基类。请说明您是否尝试重用代码来测试业务功能或交叉关注
  • @Saravanan 我不完全理解你的问题。我们使用这个测试套件来验证模块是否按照规范工作。并且想要验证另一个模块是否符合相同的规范
  • 那么TestABC 方法使用的是在每个构造函数中创建的模型?
  • @weichch 我已经阐明了我的代码示例,以展示模型在测试套件中的使用方式。
  • 在您的情况下,您可以在基本方法中使用工作流,但是,确实有单独的功能,以便您可以动态更改输入,使用 Func 属性编写其他方法来测试您的代码以适应各种测试用例。例如:您可以在 TestABC 方法中拥有像 protected Func<IModel, boolean> PreProcessor = null; 这样的属性,您可以检查 Preprocessor 是否不为空,如果是,则调用它或继续基本方法流程。这为您提供了更多选项来自定义代码以轻松适应多种场景。

标签: c# unit-testing mstest


【解决方案1】:

如果您只想按原样重复使用测试代码,但要测试不同的模块,那么继承似乎是最直接的,因为您需要为每个测试使用单独的测试方法,而继承是唯一的方法无需自己键入即可做到这一点的方法。这不应该引入任何重复,因为您只需重新实现每个子类中实际不同的部分。

如果您的问题在于您在测试用例类构造函数中构建测试夹具,另一种方法是将Template Method 设计模式应用于您的测试方法,并为模块添加一个虚拟创建方法在测试中,子类可以覆盖以创建您希望它们测试的特定模块的实例。或者,您可以创建一个测试设置方法并使用适当的属性对其进行标记,如this answer 中所述。

话虽如此,如果您真的希望将它们全部保存在同一个测试用例类中,那么如果您在您的基础上为正在测试的各个模块实现创建方法,您也许可以这样做测试用例类,然后将这些方法的名称传递给您的测试方法并使用反射调用它们。应该有一个属性允许您将参数传递给测试方法,这在in this answer 中进行了讨论。但是,这种方法的可行性只是我个人的猜测,您可能会冒着让您的测试更加模糊的风险。

【讨论】:

  • 感谢您涵盖所有可行的选项。看来继承毕竟是最合适的选择。
  • @YIShikunov 不客气。如果我的答案完全回答了您的问题,您是否会考虑给我的答案投票并将其标记为已接受的答案?
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
  • 2017-05-02
  • 2016-04-04
  • 2023-03-13
相关资源
最近更新 更多