我目前正在运行通过Visual Studio的测试。所有的测试运行之前,我会自动创建用户的一组号码与认识凭证,并在运行结束时,我删除这些用户。然而,有时我要取消我的测试中途。在这些情况下,测试从来没有得到清理的机会,这意味着在剩下的从试运行虚假用户信息,并可能导致下一次试运行崩溃(当它试图添加用户信息到数据库)。反正是有强制的Visual Studio / MSTEST运行即使测试被解除的清理方法是什么?
我知道有一个选项是让测试检查,确保用户信息不存在的,如果它在创建新用户之前将其删除。但是,这仍然不能解决取消试运行留下不必要的测试数据的问题。
更新:
很抱歉的误解,在试验开始然而清理数据是不是一种选择。我给这个问题的一个非常简单的看法,但简单地说,我必须确保在试验开始时不存在的检验数据的简单方法。所有的清理必须出现在测试结束。
那是不可能的。你最好找到喜欢使用,用于测试和清洁的所有数据独立的数据库每次测试之前,用固定的一组测试用户或标记与一些标志测试数据的替代解决方案。检查Isolating database data in integration tests吉米·博加德文章。
没有内置的方式来改变MSTest的默认行为。从理论上讲,你可以写MSTest的扩展,利用TestExecution.OnTestStopping
事件,而不是一个简单的过程,它需要注册表更改。此外,很多人抱怨说,它无法正常工作。
还有MSTest的V2,MSTest的新版本的新的扩展点。但它看起来就像你不能改变取消与此点的行为,只写属性装饰。见Extending MSTest V2。
您不能使用AppDomain.CurrentDomain.ProcessExit
和Process.GetCurrentProcess().Exited
事件,因为取消似乎杀试运行处理。
NUnit的也不会在目前支持这一点。请参阅相关的NUnit测试适配器Run TearDowns on VS Cancel Test Run问题。
相反,在测试结束时调用清理功能的,我定义在每个测试的开始,以解决这一确切的问题。
创建数据以及之前执行的清理,这将确保你有什么没有发生剩余的数据。当然,这仅仅是可能的,如果你能在运行安装程序之前识别任何剩余的数据。
这个想法是,在测试开始之前一个交易被初始化。为了使数据被保存在数据库中,事务必须COMMITED,但它从来没有COMMITED。它的工作原理的情况下,当测试停止,测试的成功或不成功的情况下完成。
在集成测试,我们使用这样的事情(与NUnit的)(它真正的生产代码)
public class RollbackAttribute : TestAttribute, ITestAction
{
private TransactionScope _transaction;
public void BeforeTest(ITest test)
{
_transaction = new TransactionScope();
}
public void AfterTest(ITest test)
{
_transaction.Dispose();
}
public ActionTargets Targets => ActionTargets.Test;
}
[TestFixture]
public class SomeTestClass
{
[Rollback] //No need [Test] because Rollback is inherit it.
public void SomeTestMethod()
{
}
}
在MSTest的,你可以做类似的东西,但在这种情况下,你应该从基类继承,我希望它的作品。例如:
public class RollbackTestBase
{
private TransactionScope _transaction;
[TestInitialize]
public virtual void Setup()
{
_transaction = new TransactionScope();
}
[TestCleanup]
public virtual void TearDown()
{
_transaction.Dispose();
}
}
[TestClass]
public class IntegrationTest : RollbackTestBase
{
[TestMethod]
public void TestDataBase()
{
Assert.IsTrue(true);
}
[TestInitialize]
public virtual void Init()
{
}
[TestCleanup]
public virtual void CleanUp()
{
}
}
有其中有2例,我们需要考虑的,而在分子ATP分配资源(资源可能会创建用户,数据库连接)。他们是
创建和删除每次测试后的资源:
如果我们要测试的执行之前创建特定对象的实例,并要清理执行测试后,分配给该对象的内存,那么我们使用NUnit的Test SetUp
和Test TearDown
属性。在你的情况下对象为用户数的创建。
[SetUp]
:装饰有测试设置属性功能包含一段代码,任何测试的执行之前执行。
[TearDown]
:该函数装饰有测试TearDown特性包含一段代码,任何测试的执行之后执行
执行:
[TestClass]
public class UnitTest1
{
[SetUp]
public void SetUP()
{
// Creating Users with proper credentials
}
[TestMethod]
public void TestMethod1()
{
//Write your ATP
}
[TearDown]
public void TearDown()
{
//Clean up
}
}
资源的创建和删除组测试后:
现在,如果我们想创建一个组测试对象的实例,并希望所有的测试执行后的清理内存中,然后[TestFixtureSetUp]
和[TestFixureTearDown]
初始化对象分别以清理内存。同样在你的情况对象可以是用户组的创建。
[TestFixtureSetUp]
:功能装饰着TestFixtureSetUp
将测试组的执行之前执行一次。
[TestFixtureTearDown]
:功能装饰着TestFixtureTearDown
将测试组的执行后,执行一次。
履行
[TestFixture]
public class Tests
{
[TestFixtureSetUp]
public void Setup()
{
//Create users with credentials
}
[Test]
public void _Test1()
{
//Test_1
}
[Test]
public void _Test2()
{
//Test2
}
[TestFixtureTearDown]
public void CleanUp()
{
//Cleanup; Here you need to add code to Delete all users
}
}
注:我会建议你,如果你想创建和删除用户特定ATP然后用SetUp
和TearDown
去。如果您正试图同为一堆分子ATP的,我建议你用TestFixtureSetUp
和TestFixtureTearDown
去。
“如果你的测试获得通过或失败,安装和拆卸功能将执行”
参考文献:
我想你测试之前,你应该打开一个事务,创建数据,并完成测试试验。但不要提交事务。这将确保测试不能在所有影响您的数据库。
更新:更简单的方法是使用泊坞窗容器。您可以从图像上运行一个容器和测试完成后删除该容器。这绝对应该降低测试的复杂性。
Visual Studio中使用NUNIT因此,你可以使用TearDownAttribute。它应该在测试运行后,即使测试被取消。您可以编写一个函数来清理你的数据。
请在此阅读的参考文档:http://nunit.org/docs/2.2/teardown.html
只是为了澄清更多有关单位标准。请按照测试类中的步骤:
[TestFixture]
public class _TestClass
{
[TestFixtureSetUp]
public void Setup()
{
//Clearup can be here before start of the tests. But not Recommended
}
[Test]
public void _Test1()
{
}
[Test]
public void _Test2()
{
}
[TestFixtureTearDown]
public void CleanUp()
{
//I will recommend to clean up after all the tests complete
}
}
一个更好的解决问题的方法使用所谓的“数据库嘲弄”。在这种情况下,你将有你的测试有不同的数据库(或假的,虚拟的)上运行。
本文介绍了如何实现它在C# https://msdn.microsoft.com/en-us/library/ff650441.aspx