MSTest: [ClassInitialize]和[ClassCleanup]导致测试结果显示为“未运行”

18

更新 2021-07-10: 已解决

旧版本的Visual Studio和MSTest.Framework可以很好地说明问题,但VS2019和MSTest的最新版本组合(如下所列)只在测试前加了一个感叹号,并没有说明问题所在。

实际问题是签名不正确。这两个方法都必须是静态的,并且用 [ClassInitialize] 标记的方法需要带有 TestContext 类型的参数。

    [ClassInitialize]
    public static void TestInitialize(TestContext _)
    {
        ...
    }

    [ClassCleanup]
    public static void TestCleanup()
    {
        ..
    }
为了能够与PLC(工业实时控制)结合使用MSTests,我需要在所有测试开始之前建立与PLC的连接,并在所有测试完成后断开连接并进行清理。这可以通过MSTests属性[AssemblyInitialize]在所有测试类之前或[ClassInitialize]在每个单独测试类之前实现(是的,我知道这种构造不可能进行并行测试)。然而,这些属性会导致测试状态显示“未运行”(蓝色感叹号)。因此,测试被发现但未执行。令人奇怪的是,[TestInitialize][TestCleanup]属性可以正常工作,但为每个测试建立和清理PLC连接需要太长时间。 作为解决方法,我可以使用静态构造函数,但是清理连接需要一个静态终结器,在C#中不存在。无论如何,我更喜欢纯代码而不是这样的解决方法。 我将问题简化到了最小值:
    [TestClass]
    public class DebugTest
    {
        [ClassInitialize] 
        public void TestInitialize()
        {
            ...
        }

        [ClassCleanup] 
        public void TestCleanup()
        {
            ...
        }

        [TestMethod]
        public void Test1()
        {
            Assert.IsTrue(true);
        }

        [TestMethod]
        public void Test2()
        {
            Assert.IsFalse(false);
        }

    }

以下是相关版本信息:

  • .NET 5.0
  • 所有项目都编译为“Any CPU”,包括测试项目
  • Microsoft Visual Studio Professional 2019: v16.9.4
  • MSTest.TestAdapter: v2.2.5 MSTest.TestFramework: v2.2.5
  • Microsoft.NET.Test.Sdk: v16.10.0

奇怪的是我在互联网上找不到类似的问题。有人有解决方案吗?

1个回答

15

OP自己回答了他们的问题,但我认为应该把它放在这里。

旧版本的 Visual Studio 和 MSTest.Framework 会清楚地说明出错的地方,但是最新版本的组合(下面列出的)VS2019 和 MSTest 只会在测试前面加一个感叹号,而不说明问题所在。

实际问题是签名不正确。两个方法必须是静态的,并且用 [ClassInitialize] 标记的方法需要使用 TestContext 类型的参数。

[TestClass]
public class UnitTests
{
    [ClassInitialize]
    public static void TestInitialize(TestContext context)
    {
        // Class Setup
    }

    [ClassCleanup]
    public static void TestCleanup()
    {
        // Class Cleanup
    }

    [TestMethod]
    public void UnitTest1()
    {
        Assert.Fail();
    }
}

此外,如果您在下拉菜单中选择“测试”,则可以在“输出”窗口中找到以下错误消息:

MSTestAdapter未能发现程序集' C:......\YourTestClass.Setup'中的类'UnitTests.YourTestClass'的测试。原因是该方法必须是静态公共方法,不返回值,并且应具有接受TestContext类型的单个参数的签名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接