代码之家  ›  专栏  ›  技术社区  ›  Andriy Volkov

如何对时序逻辑进行单元测试?

  •  7
  • Andriy Volkov  · 技术社区  · 17 年前

    • 插入密钥(IKey密钥)

    Car的目的是配置并返回一个IDrivingSession,应用程序的其余部分使用该会话来驱动汽车。如何对我的汽车进行单元测试?

    Test1: LoadGasoline, Assert
    
    Test2: LoadGasoline, InsertKey, Assert
    
    Test3: LoadGasoline, InsertKey, StartEngine, Assert
    
    Test4: LoadGasoline, InsertKey, StartEngine, Go, Assert
    

    谢谢你的回答。正如许多人所注意到的,我也应该对无效场景进行测试,我也有这些测试,但这个问题的重点是如何测试有效序列。

    6 回复  |  直到 17 年前
        1
  •  3
  •   Samuel Carrijo    17 年前

    我认为每种方法都应该单独测试。

    依我之见,您应该为每种情况准备环境,这样如果您更改LoadGasline方法,只有LoadGasline测试会中断,并且您不需要看到所有测试都因单个错误而中断。

    我不知道你的车的状态是什么样子的,但是,在插入密钥之前,你应该用类似Car的方法进行准备。汽油总量(20);但不依赖于LoadGasline方法的复杂逻辑。

    稍后,您将需要一个测试(在这种情况下,不是单元测试)来测试所有序列。

        2
  •  2
  •   17 of 26    17 年前

    这允许您在运行测试之前将目标对象置于适当的状态。这样,您的测试可以根据您正在测试的特定代码通过或失败,而不是根据运行测试之前所需的代码。

    Test1: 
        LoadGasoline, Assert
    
    Test2 Setup:
        LoadGasoline
    
    Test2:
        InsertKey, Assert
    
    Test3 Setup: 
        LoadGasoline, InsertKey
    
    Test3:
        StartEngine, Assert
    
    Test4 Setup: 
        LoadGasoline, InsertKey, StartEngine
    
    Test4:
        Go, Assert
    

    实际上,由于测试都是按顺序运行的,因此如果前一个测试通过,则测试的设置不会失败。

    话虽如此,你还应该测试那些预计不会奏效的失败案例,但这是另一个问题。

        3
  •  1
  •   mqp    17 年前

    你为什么不想做这些测试?

    Go 如果你在之前或之后调用它,它的行为会非常不同,比如说, InsertKey 正确的所以在我看来,你应该测试这两种行为。

        4
  •  1
  •   Frank Schwieterman    17 年前

    您可以容忍这种情况的一种方法是使用提取方法对一个状态的测试进行重构,以便可以使用相同的代码来准备下一个测试。

        5
  •  1
  •   Community Mohan Dere    6 年前

    我可能会

    Test 1: LoadGasoline, Assert, InsertKey Assert, StartEngine Assert, Go Assert
    Test 2: LoadGasoline, Go, Assert
    Test 3: Go, Assert
    Test 4: StartEngine, Go, Assert
    

    编辑:

    • 用汽油和右钥匙启动汽车(上述测试1)
        6
  •  0
  •   Kathy Van Stone    17 年前

    testLoadGasoline
    
    testInsertKeyGasolineNotLoaded
    
    testStartEngineKeyNotInserted
    
    testGoEngineNotStarted
    
    testGo
    

    如果可以直接查看可以添加的中间步骤

    testInsertKeyGasolineLoaded
    
    testStartEngineKeyInserted
    

    请注意,如果您可以直接设置状态(取决于语言和设计),那么 testInsertKeyGasolineLoaded 可能实际上不会打电话 LoadGasoline .

    推荐文章