清理取消测试之后

问题描述 投票:8回答:9

我目前正在运行通过Visual Studio的测试。所有的测试运行之前,我会自动创建用户的一组号码与认识凭证,并在运行结束时,我删除这些用户。然而,有时我要取消我的测试中途。在这些情况下,测试从来没有得到清理的机会,这意味着在剩下的从试运行虚假用户信息,并可能导致下一次试运行崩溃(当它试图添加用户信息到数据库)。反正是有强制的Visual Studio / MSTEST运行即使测试被解除的清理方法是什么?

我知道有一个选项是让测试检查,确保用户信息不存在的,如果它在创建新用户之前将其删除。但是,这仍然不能解决取消试运行留下不必要的测试数据的问题。

更新:

很抱歉的误解,在试验开始然而清理数据是不是一种选择。我给这个问题的一个非常简单的看法,但简单地说,我必须确保在试验开始时不存在的检验数据的简单方法。所有的清理必须出现在测试结束。

c# visual-studio visual-studio-2013 mstest specflow
9个回答
11
投票

那是不可能的。你最好找到喜欢使用,用于测试和清洁的所有数据独立的数据库每次测试之前,用固定的一组测试用户或标记与一些标志测试数据的替代解决方案。检查Isolating database data in integration tests吉米·博加德文章。

没有内置的方式来改变MSTest的默认行为。从理论上讲,你可以写MSTest的扩展,利用TestExecution.OnTestStopping事件,而不是一个简单的过程,它需要注册表更改。此外,很多人抱怨说,它无法正常工作。

还有MSTest的V2,MSTest的新版本的新的扩展点。但它看起来就像你不能改变取消与此点的行为,只写属性装饰。见Extending MSTest V2

您不能使用AppDomain.CurrentDomain.ProcessExitProcess.GetCurrentProcess().Exited事件,因为取消似乎杀试运行处理。

NUnit的也不会在目前支持这一点。请参阅相关的NUnit测试适配器Run TearDowns on VS Cancel Test Run问题。


7
投票

相反,在测试结束时调用清理功能的,我定义在每个测试的开始,以解决这一确切的问题。


5
投票

创建数据以及之前执行的清理,这将确保你有什么没有发生剩余的数据。当然,这仅仅是可能的,如果你能在运行安装程序之前识别任何剩余的数据。


4
投票

这个想法是,在测试开始之前一个交易被初始化。为了使数据被保存在数据库中,事务必须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()
    {
    }
}

3
投票

有其中有2例,我们需要考虑的,而在分子ATP分配资源(资源可能会创建用户,数据库连接)。他们是

  • 资源的创建和删除每次测试后。
  • 资源的创建和删除一组试验后。

创建和删除每次测试后的资源:

如果我们要测试的执行之前创建特定对象的实例,并要清理执行测试后,分配给该对象的内存,那么我们使用NUnit的Test SetUpTest 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然后用SetUpTearDown去。如果您正试图同为一堆分子ATP的,我建议你用TestFixtureSetUpTestFixtureTearDown去。

“如果你的测试获得通过或失败,安装和拆卸功能将执行”

参考文献:


3
投票

我想你测试之前,你应该打开一个事务,创建数据,并完成测试试验。但不要提交事务。这将确保测试不能在所有影响您的数据库。

更新:更简单的方法是使用泊坞窗容器。您可以从图像上运行一个容器和测试完成后删除该容器。这绝对应该降低测试的复杂性。


2
投票

Visual Studio中使用NUNIT因此,你可以使用TearDownAttribute。它应该在测试运行后,即使测试被取消。您可以编写一个函数来清理你的数据。

请在此阅读的参考文档:http://nunit.org/docs/2.2/teardown.html


2
投票

只是为了澄清更多有关单位标准。请按照测试类中的步骤:

[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
        }
}

参考:http://nunit.org/docs/2.5/fixtureTeardown.html


2
投票

一个更好的解决问题的方法使用所谓的“数据库嘲弄”。在这种情况下,你将有你的测试有不同的数据库(或假的,虚拟的)上运行。

本文介绍了如何实现它在C# https://msdn.microsoft.com/en-us/library/ff650441.aspx

© www.soinside.com 2019 - 2024. All rights reserved.