在每个测试方法运行之前或之后自动执行方法/代码

本文关键字:执行 方法 代码 或之后 测试方法 运行 | 更新日期: 2023-09-27 18:17:26

我继承了一个包含数千个测试方法/类的测试项目,我需要实现一个新的清理过程,需要在每次测试之后或之前运行。我知道这不是最好的,但这就是我目前的处境。从现在起的一年内,我们希望所有这些测试都能正确地重建。我需要一些如何在每次测试之前或之后运行一个方法,而不需要在每个测试类中对方法进行硬编码,因为我们只是没有时间。我知道有汇编清理和初始化的属性,但这只在整个汇编之前和之后运行。我需要这样的东西,但它在每次测试后运行,而不需要对每个测试的功能进行编码。

这可能吗?有哪些选择?

编辑我使用MSTest

在每个测试方法运行之前或之后自动执行方法/代码

假设您正在使用MSTest,那么设置方法所需的属性是[TestInitialize]。使用此属性装饰的方法将在每个单独的测试之前运行。

很抱歉,我的回答很枯燥,但我自己也遇到过这种情况,我觉得我应该把它添加到知识库中。

首先,上面提供的答案在一半中是绝对正确的:你想要一个带有[TestInitialize]的函数,并且它必须与[TestMethod]在同一个类中。

甚至做一些恶作剧,比如把所有的测试文件包装在一个"公共分部类GlobalTesting{…}'不起作用,因为TestInitialize不能渗透到子类

所以…你需要让每个测试类都有一个TestInitialize方法,或者你需要让它们从一个有TestInitialize方法的类派生出来。

"但是我们有成千上万的测试类!"

理解。在我的例子中,只有几个类,所以我可以手工完成。但如果你不能呢?

正则表达式为赢!

Regex得到了我对编程中最未充分利用的技术的投票。在这种情况下,下面是我对notepad++

中的正则表达式查找-替换的半粗糙尝试
Search String: ('[TestClass']'s*'w*'s*'w*'s*class's+[!-~]*)('s*'{)
Replace String: '1 : ParentClassToPerformCleanups '2

这是做什么的?它搜索:

Capture Group #1
    [TestClass]
    any amount of white space
    optionally a single word with optional whitespace behind it
    optionally another single word with optional whitespace behind it
    the word 'class'
    at least one whitespace character
    a function name
Capture Group #2
    any amount of white space
    a { brace

…也就是说,任何标记为[TestClass]的类,但不派生任何东西。

别误会我的意思——这太简单了。您可能会有额外的怪癖,比如多个属性,或者实现接口的类或其他复杂性。在这种情况下,您必须使正则表达式更加健壮。但是…有了这样的东西,它将使更改数千个类的类定义变得更加容易。