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

时间:2014-08-11 20:33:25

标签: c# .net unit-testing c#-4.0 visual-studio-2012

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

这可能吗?有哪些选择?

修改 我正在使用MSTest

2 个答案:

答案 0 :(得分:6)

假设您正在使用MSTest,则设置方法所需的属性为[TestInitialize]。使用此属性修饰的方法将在每次测试之前运行。

答案 1 :(得分:0)

对不起,死灵答案,但我自己遇到了这种情况,并认为我应该添加到知识库中。

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

即使做一些恶作剧,比如将所有测试文件包装在“公共部分类 GlobalTesting { ... }”中也不起作用,因为 TestInitialize 不会渗透到子类中。< /p>

所以...你需要让每个测试类要么有一个 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] 的任何类,但不派生自任何东西。

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