【问题标题】:How to order methods of execution using Visual Studio to do integration testing?如何使用 Visual Studio 对执行方法进行排序以进行集成测试?
【发布时间】:2011-01-13 19:36:48
【问题描述】:

关于使用 VS 2010 进行集成测试,我有 2 个问题

首先,我真的需要找到一种方法来按照我希望的顺序执行这些测试方法。注意:我知道在单元测试中,方法应该独立于其他任何东西运行,但这些是集成测试,我确实取决于哪个方法首先运行的顺序。

同样,有没有办法通过运行测试来保留局部变量?例如下面的代码现在失败了。

[TestClass]
public class UnitTest1
{
    int i = 0;
    [TestMethod]
    public void TestMethod1()
    {
        i = 5;
    }

    [TestMethod]
    public void TestMethod2()
    {
        Assert.AreEqual(5, i);
    }
}

那么有没有办法做到这些?

【问题讨论】:

    标签: visual-studio-2010 testing integration-testing


    【解决方案1】:

    为了按特定顺序执行测试,我遵循了以下步骤:

    在包含 test1、test2 和 test3 的测试项目中

    1 右击项目'Add'->'new test..."
    2 选择“有序测试”
    3 双击出现“OrderedTest1.orderedtest”的文件

    4 如果之前没有构建项目,则构建项目
    5 从可用测试列表中选择您想要的测试并订购它们

    从那时起,测试列表编辑器中将出现一个新测试

    这是一个额外的测试,它以正确的顺序运行包含的测试,但是如果你不小心运行了项目中的所有测试,排序列表中包含的测试将被执行两次,所以你需要以某种方式管理列表或测试类别避免这种情况。
    我尝试禁用单个测试,但这也禁用了有序测试,我不知道更好的方法。

    【讨论】:

    • 感谢 Cristian 在 pix 上花费的时间。我将其标记为答案。不过,我不得不说这对于我正在寻找的东西来说可能太多了,所以我现在可能不得不将多个测试包含在一个单一的测试方法中。我还联系了 Rob,他说不同的测试运行者表现不同,VS 似乎以随机顺序执行这些测试方法,因为它将它们视为应该能够以任何顺序运行的单元测试。希望他们有一个属性来将测试类标记为 [IntegrationTest] 然后按照它们出现的顺序执行方法。
    • @Cristian,在阅读了这么多“无法完成”和“您应该重命名测试以按字母顺序排序”等之后,您的答案是第一个真正有效的答案。谢谢你!
    【解决方案2】:

    最佳实践是通过使用属性 [TestInitialize] 和 [TestCleanUp] 或 [ClassInitialize] 和 [ClassCleanup] 使用函数来设置和清理测试。
    http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting(v=VS.100).aspx

    下一个代码是与您想要的类似的示例:

    [TestClass]
    public class UnitTest1
    {
        int i=0;
    
        [TestInitialize]
        public void Setup()
        {
            i = 5;
        }
    
        [TestMethod]
        public void TestMethod1()
        {
            Assert.AreEqual(5, i);
        }
    }
    

    SetUp 函数将在执行每个测试之前被调用。 如果您需要将值从一个测试传递到另一个测试,您可能需要考虑使用静态变量,由于执行顺序不确定,因此不推荐使用。

    通常有一种方法可以通过使用设置/清理技术来避免需要特定的顺序,但确实对于非常复杂的集成测试来说可能并非如此。
    如果没有可能的方法来避免让它们重新排序,您可以考虑将它们合并为一个,再次打破每个测试只有一个断言的最佳实践,但如果它们彼此之间的依赖程度如此之大,那么这可能会更好方式,因为在这种情况下,一个测试失败可能会影响其他测试的结果。

    编辑: 可能使用有序测试回答问题 1,并使用静态变量问题 2: http://msdn.microsoft.com/en-us/library/ms182631.aspx

    【讨论】:

    • 感谢克里斯蒂安的意见。我知道你提到的属性,不幸的是这些不是我所追求的。我正在针对测试数据源运行集成测试,因此即使它们在中间某处失败,我也可以将数据恢复回来。我在 SpecFlow 上看到了 Rob Conery 的视频,其中他似乎实现了这些目标 tekpub.com/view/concepts/5 我只是不知道他是怎么做到的。
    • 我刚刚添加了编辑问题并添加了有序测试的想法。让我知道这是否真的有效。
    • 感谢克里斯蒂安,我刚刚检查了您指出的有序测试,但我不知道如何让它们执行?我在右侧面板中选择了我想要的测试,但是当我点击运行测试时,它会运行我在整个解决方案中的所有测试,有什么想法吗?
    • 我为有序的测试主题制定了一个新的答案,因为我自己也值得尝试一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2018-10-16
    相关资源
    最近更新 更多