如何在MSTest的TestCleanup方法中获取TestMethod的传入参数
解决方案
你原有实现的最大隐患是用了静态字段存储参数,当开启测试并行执行时,多个测试会互相覆盖字段值,导致清理逻辑操作错误的文件,严重影响测试可靠性。
实际上你之前尝试的TestContext对象就是最优实现路径,你误以为DataRow属性是其他用途,但对于[DataRow]标记的数据驱动测试来说,这个属性正是用来存储当前测试用例的参数行的,你可以直接从中读取参数值,不需要额外定义字段暂存。
改进后的实现代码如下:
[TestClass] public class ExampleTestClass { public TestContext TestContext { get; set; } [TestMethod] [DataRow("filename_for_test")] public void CanDoSomethingWithAFile(string filename) { // 无需额外暂存参数 // 其余测试逻辑... } [TestCleanup] public void CleanupTest() { if(TestContext.CurrentTestOutcome == UnitTestOutcome.Passed) { // 直接从DataRow按参数顺序读取即可 string filename = TestContext.DataRow[0].ToString(); TryToDeleteTestFiles(filename); } } }
补充说明:
- 如果你有多个
DataRow参数,直接按参数的定义顺序从TestContext.DataRow的对应索引读取即可,比如第二个参数用TestContext.DataRow[1]获取 - 如果你更习惯用字段暂存的写法,只需要把原来的静态字段改成普通实例字段即可,MSTest每次执行测试方法前都会新建测试类实例,实例字段不会在多个测试之间共享,不存在线程安全问题。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

