我需要测试一个多步骤(大约70-90步)的过程,每个步骤都有一些特定的退出条件。我对快乐案例路径(一切都成功)进行了测试,并希望将其用作建模不那么快乐案例路径的基础(即对于每个可能的退出条件,我需要一个测试用例,即幸福案例路径略有变化。)
我考虑过使用模板模式的变体(即将通用测试用例驱动程序建模为模板并将每个单独的测试基于此模板),但这很快变得非常笨拙。
由于这是一个纯粹基于事件的系统(通信协议),我可以将测试建模为事件流,但这并不能帮助我将特定测试用例组织为通用序列的变体。
答案 0 :(得分:3)
你带来这个问题的案例看起来很像是数据驱动测试策略的一个很好的候选者。 " xUnit Test Patterns: Refactoring Test Code"通过 Gerard Meszaros ,定义测试的条件,以符合数据驱动的测试策略,如下所示(p 288):
例如,我们可能希望运行基本相同的测试 稍有不同的系统输入并验证实际输出 因此而变化。这些测试中的每一个都完全由 同样的步骤。
data-driven testing上的维基百科条目还指出:
任何有可能改变的东西(也称为"变异性," 并包括环境,终点,测试数据等元素, 位置等)从测试逻辑(脚本)中分离出来 进入了一个“外部资产”。这可以是配置或测试 数据集。脚本中执行的逻辑由数据决定 值。
数据驱动测试的推荐实施策略是将数据与测试逻辑分开。每个测试的输入和预期输出数据一起存储在文件或数据库中,并键入测试。测试逻辑以模块化方式组织,以便增加重用。使用适当的实现语言/工具,测试逻辑可以发展成DSL(特定于域的语言)或甚至是完全成熟的解释器(在xUnit Test Patterns p288中推荐)。这样做的结果是:测试的制定对于意图和正在执行的功能基本上是声明性和明确的,这也将把您的测试转换为系统的另一个有意义的文档源。
进一步阅读:
答案 1 :(得分:3)
为了测试一个类对一系列事件的变化的响应,我使用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() { ...