什么是测试用例?

5
我很难找到“测试用例”这个词的明确定义。一些来源认为,测试用例是一个扩展了TestCase类的类。其他来源则认为,测试用例是单个测试方法。JUnit文档不太清楚,我觉得“测试用例”和“测试”这两个词的意思是一样的:

Test注解告诉JUnit可以将其附加到的public void方法作为测试用例运行。为了运行该方法,JUnit首先构造该类的新实例,然后调用带有注解的方法。任何由测试引发的异常都将被JUnit报告为失败。如果没有抛出异常,则假定测试已成功。

那么,“测试用例”到底是什么,它与“测试”的关系是什么?

3
我认为你找不到“硬定义”的原因是因为它本身并没有一个。这真的很重要吗?如果你在使用“模糊”的术语时无法清晰地表达自己,那就要清楚地说明你自己的用法。 - Matt Ball
1
我认为(警告:以下内容只是猜测)某些混淆之处源于有人在某个时候意识到他们可以重构一些JUnit代码以引入抽象基类(或接口),然后使用组合设计模式简化一些代码,从而导致“Test”和“TestCase”的含义变得不那么明显。 - Raedwald
2个回答

1

我会指向JUnit关于TestCase的文档。其中,它描述了三个条件来定义一个TestCase:

  1. 实现TestCase的子类
  2. 定义存储fixture状态的实例变量
  3. 通过重写setUp()方法初始化fixture状态
  4. 通过重写tearDown()方法在测试后进行清理。

我认为setUp和tearDown部分在这里非常关键。测试用例不仅仅是一个带注释的方法。测试用例是该方法加上初始化和销毁测试运行的框架。

所以回答你的问题,一个测试是一个带注释的方法,试图验证单个方法的工作原理,而测试用例是该测试加上它将被运行的框架。


它还说:“测试用例定义了运行多个测试的装置。[...]每个测试在自己的装置中运行[...]为每个测试实现一个与装置交互的方法。”这听起来像“方法=测试”和“类=测试用例”... - fredoverflow
@FredOverflow 我认为你把"TestCase"和"test case"的语义搞混了。前者指的是JUnit层次结构中的一个类,后者则指单元测试的概念公式化。 - wheaties
也许我已经被良好的命名约定“宠坏”了?除非它的对象(或从其派生的类的对象)表示测试用例,否则我不会将一个类命名为TestCase - fredoverflow
@FredOverflow 扩展 junit.framework.TestCase 类的实例确实代表测试用例!每个实例运行一个以 "test" 开头的方法(在测试之前运行 setUp(),在测试之后运行 tearDown())。当您告诉您的 IDE 运行扩展 TestCase 的类时,它会创建一个套件来运行您的类定义的测试(具体而言,它创建一个 TestSuite,其中包含每个测试方法的一个 TestCase 实例)。 - NamshubWriter
关于为什么TestCase实现了Test,请参见http://junit.sourceforge.net/doc/cookstour/cookstour.htm。 - NamshubWriter
显示剩余2条评论

1
在JUnit上下文中,“测试用例”可以指包含相关测试的类(在JUnit 4中,您不再需要扩展 TestCase ),也可以是单个测试方法。实际上,这个术语没有一个硬性定义。
在我的书中,测试用例是回答以下问题的答案:被测试的代码片段是否按预期行为?
测试用例可以非常小:
Foo foo = new Foo();
assertEquals( "...", foo.bar(5) );

或者他们可以设置一个数据库,填充测试数据,创建一个对象模型,然后调用一些方法来验证对象模型的修改是否符合期望。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接