首先我们需要先下载相应的 JUnit 相关嘚 JAR 包下载的过程可以去 JUnit 的官方网站,也可以直接通过 Maven 资源仓库来完成
使用简单的 @Test 注解实现我们的如何写测试用例方法的编写和执行
准備工作做好之后,接下来我们就可以开始尝试编写壹个简单的如何写测试用例代码了首先,我们编写了壹个 Calculator 类并提供五个方法分别完荿加减乘除以及求平方的运算。代码如下:
在如何写测试用例类中用到了JUnit4框架自然要把相应地Package包含进来。最主要地一个Package就是org.junit.*把它包含進来之后,绝大部分功能就有了还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在如何写测试用例的时候使用的壹系列assertEquals()方法就来自这个包大家注意壹下,这是壹个静态包含(static)是JDK5中新增添的壹个功能。也就是说assertEquals是Assert类中的壹系列的静态方法,壹般的使用方式是Assert. assertEquals()但是使用了静态包含后,前面的类名就可以省略了使用起来更加的方便。
另外要注意的是我们的如何写测试用例类是壹个独立的类,没有任何父类洳何写测试用例类的名字也可以任意命名,没有任何局限性所以我们不能通过类的声明来判断它是不是一个如何写测试用例类,它与普通类的区别在于它内部的方法的声明我们接着会讲到。在如何写测试用例类中并不是每壹个方法都是用于如何写测试用例的,所以我們必须使用“注解”来明确表明哪些是如何写测试用例方法“注解”也是JDK5的壹个新特性,用在此处非常恰当我们可以看到,在某些方法的前有@Before、@Test、@Ignore等字样这些就是注解,以壹个“@”作为开头这些注解都是JUnit4自定义的,熟练掌握这些注解的含义对于编写恰当的如何写測试用例类非常重要。
首先我们要在方法的前面使用@Test标注,以表明这是壹个如何写测试用例方法对于方法的声明也有如下要求:名字鈳以随便取,没有任何限制但是返回值必须为void,而且不能有任何参数如果违反这些规定,会在运行时抛出壹个异常至于方法内该写些什么,那就要看你需要如何写测试用例些什么了比如上述代码中,我们想如何写测试用例壹下add()方法的功能是否正确就在如何写测试鼡例方法中调用几次add函数,初始值为0先加7,再加8我们期待的结果应该是15。如果最终实际结果也是15则说明add()方法是正确的,反之说明它昰错的assertEquals(15, calculator.getResult());就是用来判断期待结果和实际结果是否相等,其中第壹个参数填写期待结果第二个参数填写实际结果,也就是通过计算得到的結果这样写好之后,JUnit 会自动进行如何写测试用例并把如何写测试用例结果反馈给用户
如果想运行它,可以在 eclipse 的资源管理器中选择该类攵件然后点击右键,选择 Run As->JUnit Test 即可看到运行结果
使用@Test 的属性 Ignore 指定如何写测试用例时跳过这个方法
如果在写程序前做了很好的规划,那么哪些方法是什么功能都应该实现并且确定下来因此,即使该方法尚未完成他的具体功能也是确定的,这也就意味着你可以为他编写如何寫测试用例用例但是,如果你已经把该方法的如何写测试用例用例写完但该方法尚未完成,那么如何写测试用例的时候无疑是“失败”这种失败和真正的失败是有区别的,因此 JUnit 提供了壹种方法来区别他们那就是在这种如何写测试用例函数的前面加上 @Ignore 标注,这个标注嘚含义就是“某些方法尚未完成暂不参与此次如何写测试用例”。这样的话如何写测试用例结果就会提示你有几个如何写测试用例被忽畧而不是失败。壹旦你完成了相应函数只需要把@Ignore标注删去,就可以进行正常的如何写测试用例
我们再运行壹次如何写测试用例,会看到如下结果从图中可以很明显的看出,方法testSquare() 上的 @Ignore 注解已经生效了运行时直接跳过了它,而方法testAdd()仍然正常的运行并通过了如何写测试鼡例
前置工作通常是指我们的如何写测试用例方法在运行之前需要做的壹些准备工作,如数据库的连接、文件的加载、输入数据的准备等需要在运行如何写测试用例方法之前做的事情都属于前置工作;类似的,后置工作则是指如何写测试用例方法在运行之后的壹些要做嘚事情如释放数据库连接、输入输出流的关闭等;比如我们上面的如何写测试用例,由于只声明了壹个 Calculator 对象他的初始值是0,但是如何寫测试用例完加法操作后他的值就不是0了;接下来如何写测试用例减法操作,就必然要考虑上次加法操作的结果这绝对是壹个很糟糕嘚设计!我们非常希望每壹个如何写测试用例方法都是独立的,相互之间没有任何耦合度因此,我们就很有必要在执行每壹个如何写测試用例方法之前对Calculator对象进行壹个“复原”操作,以消除其他如何写测试用例造成的影响因此,“在任何壹个如何写测试用例方法执行の前必须执行的代码”就是壹个前置工作我们用注解 @Before 来标注它,如下例子所示:
...//这里省略部分代码
...//这里省略部分代码
另外要说的是注解 @Before 是定义在 org.junit.Before 这个类中的,因此使用时需要将其引入我们的代码中这样做了之后,每次我们运行如何写测试用例方法时JUnit 都会先运行 setUp() 方法將 result 的值清零。不过要注意的是这里不再需要 @Test 注解,因为这并不是壹个 test只是壹个前置工作。同理如果“在任何如何写测试用例执行之後需要进行的收尾工作,我们应该使用 @After 来标注方法与它类似。由于本例比较简单不需要用到此功能,所以我们只是简单了给它添加了壹个 tearDown() 方法并在收尾时打印壹句话到控制台并且使用 @After 来注解这个方法。
上面我们提到了两个注解 @Before 和 @After 我们来看看他们是否适合完成如下功能:有壹个类负责对大文件(超过500 MB)进行读写,他的每壹个方法都是对文件进行操作换句话说,在调用每壹个方法之前我们都要打开壹个大文件并读入文件内容,这绝对是壹个非常耗费时的操作如果我们使用 @Before 和 @After ,那么每次如何写测试用例都要读取壹次文件效率及其低下。所以我们希望的是在所有如何写测试用例壹开始读壹次文件,所有如何写测试用例结束之后释放文件而不是每次如何写测试用唎都读文件。JUnit的作者显然也考虑到了这个问题它给出了@BeforeClass 和 @AfterClass 两个注解来帮我们实现这个功能。从名字上就可以看出用这两个注解标注的函数,只在如何写测试用例用例初始化时执行
使用@Test 的属性 timeout 来完成限时如何写测试用例以检测代码中的死循环
现在假设我们的 Calculator 类中的 square() 方法昰个死循环,那应该怎么办呢比如说像下面这样:
如果如何写测试用例的时候遇到死循环,你的脸上绝对不会露出笑容的因此,对于那些逻辑很复杂循环嵌套比较深的、有可能出现死循环的程序,因此壹定要采取壹些预防措施限时如何写测试用例是壹个很好的解决方案。我们给这些如何写测试用例函数设定壹个预期的执行时间超过了这壹时间,他们就会被系统强行终止并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些 Bug 了要实现这壹功能,只需要给 @Test 标注加壹个参数timeout即可代码如下:
timeout参数表明了你预计該方法运行的时长,单位为毫秒因此2000就代表2秒。现在我们让这个如何写测试用例方法运行壹下看看失败时是什么效果。
使用@Test 的属性expected来監控如何写测试用例方法中可能会抛出的某些异常
JAVA中的异常处理也是壹个重点因此你经常会编写壹些需要抛出异常的函数。如果你觉得壹个函数应该抛出异常但是它没抛出,这算不算 Bug 呢这当然是Bug,JUnit 也考虑到了这壹点并且可以帮助我们找到这种 Bug。例如我们写的计算器类有除法功能,如果除数是壹个0那么必然要抛出“除0异常”。因此我们很有必要对这些进行如何写测试用例。代码如下:
如上述代碼所示我们需要使用@Test注解中的expected属性,将我们要检验的异常(这里是 java.lang.ArithmeticException)传递给他这样 JUnit 框架就能自动帮我们检测是否抛出了我们指定的异瑺。
大家有没有想过这个问题当你把如何写测试用例代码提交给JUnit框架后,框架是如何来运行你的代码的呢答案就是Runner。在JUnit中有很多个Runner怹们负责调用你的如何写测试用例代码,每壹个Runner都有其各自的特殊功能你要根据需要选择不同的Runner来运行你的如何写测试用例代码。可能伱会觉得奇怪前面我们写了那么多如何写测试用例,并没有明确指定壹个Runner啊这是因为JUnit中有壹个默认的Runner,如果你没有指定那么系统会洎动使用默认Runner来运行你的代码。换句话说下面两段代码含义是完全壹样的:
...//省略此处代码
//用了系统默认的JUnit4.class,运行效果完全壹样
...//省略此处玳码
创建一个source folder 资源文件夹 test资源文件夹和普通的文件夹区别是,资源文件夹中的java文件可以被自动编译
junit4采用的是通过注解的方式(在方法嘚上面加上@).
@Before表示在所有方法运行前运行的方法;
@After表示在所有的方法运行之后执行的方法;
@Test表示这是一个如何写测试用例方法
@BeforeClass表示在这个如何寫测试用例类构造之前执行的方法
@AfterClass表示在这个如何写测试用例类构造之后执行的方法
绿色的表示运行通过的方法,红x的表示运行失败的方法.