【问题标题】:Dealing with branching tests处理分支测试
【发布时间】:2014-03-01 13:24:44
【问题描述】:

我需要测试一个多步骤(大约 70-90 个步骤)的过程,该过程在每个步骤中都有一些特定的退出条件。我对快乐案例路径进行了测试(一切都成功),并希望以此为基础来建模不太快乐的案例路径(即,对于每个可能的退出条件,我需要一个测试用例快乐案例路径的微小变化)。

我曾考虑过使用模板模式的变体(即将通用测试用例驱动程序建模为模板,并以此为基础进行每个单独的测试),但这很快变得相当笨拙。

由于这是一个纯粹基于事件的系统(通信协议),我可以将测试建模为事件流,但这无助于我将特定测试用例组织为通用序列的变体。

【问题讨论】:

  • 我认为组合在这里可能更有用:将常见的测试代码基础架构分解为一致的分组功能,并在重用相同的测试基础架构的同时使用输入数据驱动您的测试用例。但是,除非您在不考虑通用性或重用性的情况下运行几个案例,然后查看并找出在测试用例中分解和重用的意义是什么,否则您无法做到这一点。

标签: testing


【解决方案1】:

您在这个问题中提出的案例看起来很适合数据驱动的测试策略。 Gerard Meszaros 的“xUnit Test Patterns: Refactoring Test Code”定义了符合数据驱动测试策略的测试条件,如下所示(第 288 页):

例如,我们可能希望运行基本相同的测试 略有不同的系统输入,并验证实际输出 相应地变化。这些测试中的每一个都将完全包括 步骤相同。

data-driven testing 上的维基百科条目还指出:

任何可能发生变化的事物(也称为“可变性”, 并包括环境、端点、测试数据等元素, 位置等)从测试逻辑(脚本)中分离出来,并且 转移到“外部资产”。这可以是配置或测试 数据集。脚本中执行的逻辑由数据决定 价值观。

数据驱动测试的推荐实施策略将数据与测试逻辑分开。每个测试的输入和预期输出数据一起存储在文件或数据库中,并在测试中键入。测试逻辑以模块化方式组织,以增加重用性。使用适当的实现语言/工具,测试逻辑可以扩展为 DSL(域特定语言)甚至是成熟的解释器(在 xUnit 测试模式 p288 中推荐)。这样做的结果是:您的测试的制定基本上是声明性的,并且明确地说明了意图和正在执行的功能,这也将您的测试转变为您的系统的另一个有意义的文档来源。



延伸阅读:

【讨论】:

    【解决方案2】:

    为了测试一个类对一系列事件变化的响应,我使用 junit-nested 获得了不错的结果,它让您可以将 setup()teardown() 方法嵌套在嵌套的静态内部类中:

    @RunWith(Nested.class)
    public class NestedJunitTest {
    
        @Test public void testWithoutLogin() { // expect 401
    
        public class LoggedInTests {
    
            Session session;
    
            @Before public void login() { session = new Session(..)
    
            @Test public void testLoggedIn() { ...
    

    类似于Jasmine's nested describe blocks

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 2017-11-12
      • 2015-03-26
      • 2013-03-31
      • 2015-12-16
      • 2012-07-21
      • 1970-01-01
      • 2017-02-13
      • 2013-03-10
      相关资源
      最近更新 更多