软件测试 入门篇 JUnit简单了解+基础知识+注解说明(重点)

今天学习利用JUnit进行Java软件测试,首先整理下老师发给我们的资料,学习并掌握其中的基础知识。我们学习的是其中的JUnit4

一、Junit简介

JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中为最成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

主要特性

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:
1. 用于测试期望结果的断言(Assertion)
2. 用于共享共同测试数据的测试工具
3. 用于方便的组织和运行测试的测试套件
4. 图形和文本的测试运行器
Junit的版本分为3.x和4.x

二、junit3.x

我们通常使用junit 3.8
(1)使用junit3.x版本进行单元测试时,测试类必须要继承于TestCase父类;
(2)测试方法需要遵循的原则:
A、public的
B、void的
C、无方法参数
D、方法名称必须以test开头
(3)不同的Test Case之间一定要保持完全的独立性,不能有任何的关联。
(4)我们要掌握好测试方法的顺序,不能依赖于测试方法自己的执行顺序。

三、junit4.x

(1)使用junit4.x版本进行单元测试时,不用测试类继承TestCase父类,因为,junit4.x全面引入了Annotation来执行我们编写的测试。
(2)junit4.x版本,引用了注解的方式,进行单元测试;

注解说明:

@Before:
使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After:
使用了该元数据的方法在每个测试方法执行之后要执行一次。

注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。

@Test(expected=*.class)
在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型

@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。

@ignore:
该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

@BeforeClass:
只在测试用例初始化时执行方法

@AfterClass:
当所有测试执行完毕之后,执行进行收尾工作。
注意:每个测试类只能有一个方法被标注为@BeforeClass 或 @AfterClass,并且该方法必须是Public和Static的。

@RunWith:(用在类之前)
JUnit中所有的测试方法都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器,但JUnit并没有限制您必须使用默认的运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),而且还可以为每一个测试类指定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要使用的运行器即可:
@RunWith(CustomTestRunner.class)
public class TestWordDealUtil {
……
}

参数化测试(Parameters):

为测试程序健壮性,可能需要模拟不同的参数对方法进行测试,如果在为每一个类型的参数创建一个测试方法,呵呵,人都疯掉了。幸好有参数化测试出现了。它能够创建由参数值供给的通用测试,从而为每个参数都运行一次,而不必要创建多个测试方法。注:测试方法(@Test 注释的方法)是不能有参数的。
参数化测试编写流程如下:
a.为参数化测试类用@RunWith 注释指定特殊的运行器:Parameterized.class
b.在测试类中声明几个变量,分别用于存储期望值和测试用的数据,并创建一个使用这几个参数的构造函数;
c.创建一个静态(static)测试数据供给(feed)方法,其返回类型为Collection,并用@Parameter 注释以修饰;

打包测试:

@RunWith:
标注传递一个参数Suite.class,注解告诉JUnit它使用org.junit.runner.Suite。这个运行机允许你手工地构建一个包含测试(可能来自许多类)的测试集。这些类的名称都被定义在@Suite.SuiteClass中。
@Suite.SuiteClasses:
来表明这个类是一个打包测试类。我们把需要打包的类作为参数传递给该标注就可以了。
在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。测试套件的写法非常简单,您只需要遵循以下规则:
• 创建一个空类作为测试套件的入口。
• 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
• 将org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
• 将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
• 保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。
@RunWith(Suite.class)
@Suite.SuiteClasses({TestWordDealUtil.class})
public class RunAllUtilTestsSuite {
}

Junit中的失败情况:

JUnit 将测试失败的情况分为两种:failure和error。Failure 一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题;而error则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误(测试代码也是代码,同样无法保证完全没有缺陷),也可能是被测试代码中的一个隐藏的bug。

猜你喜欢

转载自blog.csdn.net/shensiback/article/details/80166197