我想对我的项目做一些集成测试。现在我正在寻找一种机制,允许我在所有测试开始之前执行一些代码并在所有测试结束后执行一些代码。
请注意,我可以为每个测试设置方法和拆卸方法,但我需要对所有测试整体使用相同的功能。
请注意,我使用 Visual Studio、C# 和 NUnit。
我想对我的项目做一些集成测试。现在我正在寻找一种机制,允许我在所有测试开始之前执行一些代码并在所有测试结束后执行一些代码。
请注意,我可以为每个测试设置方法和拆卸方法,但我需要对所有测试整体使用相同的功能。
请注意,我使用 Visual Studio、C# 和 NUnit。
使用 NUnit.Framework.TestFixture 属性注释您的测试类,并使用 NUnit.Framework.TestFixtureSetUp 和 NUnit.Framework.TestFixtureTearDown 注释所有测试设置和所有测试拆卸方法。
这些属性的功能类似于 SetUp 和 TearDown,但每个夹具只运行一次它们的方法,而不是在每次测试之前和之后。
编辑以回应评论:为了在所有测试完成后运行方法,请考虑以下(不是最干净的,但我不确定更好的方法):
internal static class ListOfIntegrationTests {
// finds all integration tests
public static readonly IList<Type> IntegrationTestTypes = typeof(MyBaseIntegrationTest).Assembly
.GetTypes()
.Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(MyBaseIntegrationTest)))
.ToList()
.AsReadOnly();
// keeps all tests that haven't run yet
public static readonly IList<Type> TestsThatHaventRunYet = IntegrationTestTypes.ToList();
}
// all relevant tests extend this class
[TestFixture]
public abstract class MyBaseIntegrationTest {
[TestFixtureSetUp]
public void TestFixtureSetUp() { }
[TestFixtureTearDown]
public void TestFixtureTearDown() {
ListOfIntegrationTests.TestsThatHaventRunYet.Remove(this.GetType());
if (ListOfIntegrationTests.TestsThatHaventRunYet.Count == 0) {
// do your cleanup logic here
}
}
}