【问题标题】:MsTest - executing method before each test in an assemblyMsTest - 在程序集中的每个测试之前执行方法
【发布时间】:2020-08-03 18:29:04
【问题描述】:

是否可以在程序集中的每个测试之前运行特定方法?

我知道TestInitialize 属性,但该属性具有“类范围”。如果它是在 Test 类中定义的,它将在该类的每个测试之前执行。

我想定义一个方法,该方法将在整个程序集中定义的每个测试之前执行。

【问题讨论】:

    标签: .net mstest


    【解决方案1】:

    [TestInitialize()] 是您所需要的。

    private string dir;
    
    [TestInitialize()]
    public void Startup()
    {
        dir = Path.GetTempFileName();
        MakeDirectory(ssDir);
    }
    
    [TestCleanup()]
    public void Cleanup()
    {
        ss = null;
        Directory.SetCurrentDirectory(Path.GetTempPath());
    
        setAttributesNormal(new DirectoryInfo(ssDir));
        Directory.Delete(ssDir, true);
    }
    
    
    [TestMethod]
    public void TestAddFile()
    {
        File.WriteAllText(dir + "a", "This is a file");
        ss.AddFile("a");
        ...
    }
    
    [TestMethod]
    public void TestAddFolder()
    {
        ss.CreateFolder("a/");
        ...
    }
    

    这会为每个测试提供一个新的随机临时路径,并在完成后将其删除。您可以通过在调试中运行它并查看每个测试用例的 dir 变量来验证这一点。

    【讨论】:

    • StartUp 方法只会在从这一类执行测试之前被调用。我想在程序集中所有类的所有测试之前执行方法
    • FTQ "是否可以在每次测试之前运行特定的方法?"。我这样回答。如果您的意思是“一种方法在所有测试之前运行一次”,那么您的答案就在这里:stackoverflow.com/questions/639326/…
    • 谢谢回答。但是我想在程序集中的每个测试之前执行方法 - 而不是在一个特定类中的每个测试之前。也许我的问题不够清楚。
    • 你不需要括号...只需[TestInitialize]
    【解决方案2】:

    我不确定这个功能是否可以像其他测试框架(例如 MbUnit)一样在 MsTest 中实现。

    如果我必须使用 MsTest,那么我将通过使用 [TestInitialize] 属性定义抽象类 TestBase 来解决这个问题,并且每个需要此行为的测试都源自此基类。在你的情况下,你程序集中的每个测试类都必须继承自这个基础......

    可能还有另一种解决方案,您可以自定义测试属性 - 但我还没有尝试过... :)

    【讨论】:

      【解决方案3】:

      你想使用[AssemblyInitialize]

      见:MSDN Link

      或者这个问题: on stackoverflow

      【讨论】:

      • OP 询问了running before EACH test,这只会运行一次,对吗?
      【解决方案4】:

      MSTest 不是为每个测试实例化类吗?这就是我对它的理解。在这种情况下,您从构造函数中调用的任何内容都是初始化代码(根据定义进行每个测试)。

      编辑:如果它不起作用(我仍然认为应该这样做,因为 MSTest 需要确保单独的测试方法运行是隔离的)然后 TestInitialize 是你的属性。顺便说一句,最好的单元测试比较可以在Link on Codeplex获得。

      【讨论】:

      • 我想编写将在所有测试类中的所有测试之前执行的代码。所以你的解决方案只适用于一个测试类
      • 不,那不是真的。如果 MSTest 工具确实会在每个测试中实例化新的测试类实例(我相信这是为了测试隔离目的),那么构造函数中的代码会在每个测试方法之前运行。
      • 你写的是真的,但这并不能解决我的问题。我想在每次测试之前重置一些静态属性(我知道这是糟糕的设计)。我有 400 个带有单元测试的课程。我不想在所有类中都编写该代码。
      • 好吧,您仍然可以在构造函数中执行此操作。但是再次 TestInitialize 可能会成功。对于不熟悉框架的人来说,构造方法(类似于 xUnit)更清晰/明显。这就是我推荐它的原因。
      • 构造方法实际上是XUnit.Net中测试设置的默认选项
      【解决方案5】:

      我认为您正在寻找ClassInitialize 属性。

      【讨论】:

      • ClassInitialize 对所有类执行一次。因此,如果我们在类中有 5 个测试,则使用 ClassInitialize 的方法会执行一次。
      • 是的,他可能指的是TestInitialize。
      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2022-06-15
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多