一、Junit介绍
-
Junit 是一个 Java 编程语言的单元测试框架
所谓单元测试是测试应用程序的功能是否能够按需要正常运行,并且确保是在开发人员的期望上。单元测试是一个对单一实体(类或方法)的测试。单元测试是每个软件公司提高产品质量、满足客户需求的重要环节。
-
JUnit 促进了“先测试后编码”的理念
强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点,测试一点,编码一点……”,增加了程序员的产量和程序的稳定性可以减少程序员的压力和花费在排错上的时间。
-
什么是一个单元测试用例
单元测试用例是一部分代码,可以确保另一端代码(方法)按预期工作。为了迅速达到预期的结果,就需要测试框架。JUnit 是 java 编程语言理想的单元测试框架。
二、在Idea中使用Junit测试框架
-
Junit4 依赖安装 Settings -> Plugins -> 搜索栏中搜索 Junit 并勾选 -> 安装完成 (新版Idea默认已安装)
-
pom.xml导入junit4依赖
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.11<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>test<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>
-
测试一下,选中要测试类按下快捷键:Alt + Enter,选中create Test如图
-
勾选要测试方法和生成测试包路径
-
在指定包下查找测试类,测试类代码
-
运行,对着类名或有@Test注解的方法,右键弹出菜单:run xxx
三、JUnit断言测试
断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。
通过一个案例来讲一下什么是断言
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">//断言测试</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">assertTest</span>(){
<span style="color:#008855">String</span> <span style="color:#000000">str1</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#008855">String</span> (<span style="color:#aa1111">"abc"</span>);
<span style="color:#008855">String</span> <span style="color:#000000">str2</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#008855">String</span> (<span style="color:#aa1111">"abc"</span>);
<span style="color:#008855">String</span> <span style="color:#000000">str3</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
<span style="color:#008855">String</span> <span style="color:#000000">str4</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"abc"</span>;
<span style="color:#008855">String</span> <span style="color:#000000">str5</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"abc"</span>;
<span style="color:#008855">int</span> <span style="color:#000000">val1</span> <span style="color:#981a1a">=</span> <span style="color:#116644">5</span>;
<span style="color:#008855">int</span> <span style="color:#000000">val2</span> <span style="color:#981a1a">=</span> <span style="color:#116644">6</span>;
<span style="color:#008855">String</span>[] <span style="color:#000000">expectedArray</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">"one"</span>, <span style="color:#aa1111">"two"</span>, <span style="color:#aa1111">"three"</span>};
<span style="color:#008855">String</span>[] <span style="color:#000000">resultArray</span> <span style="color:#981a1a">=</span> {<span style="color:#aa1111">"one"</span>, <span style="color:#aa1111">"two"</span>, <span style="color:#aa1111">"three"</span>};
<span style="color:#aa5500">// 查看两个对象的值是否相等。类似于字符串比较使用的equals()方法</span>
<span style="color:#000000">Assert</span>.<span style="color:#000000">assertEquals</span>(<span style="color:#000000">str1</span>, <span style="color:#000000">str2</span>);
<span style="color:#aa5500">// 查看两个对象的引用是否相等。类似于使用“==”比较两个对象</span>
<span style="color:#000000">assertSame</span>(<span style="color:#000000">str4</span>, <span style="color:#000000">str5</span>);
<span style="color:#aa5500">// 查看运行结果是否为true</span>
<span style="color:#000000">assertTrue</span> (<span style="color:#000000">val1</span> <span style="color:#981a1a"><</span> <span style="color:#000000">val2</span>);
<span style="color:#aa5500">// 查看运行结果是否为false</span>
<span style="color:#000000">assertFalse</span>(<span style="color:#000000">val1</span> <span style="color:#981a1a">></span> <span style="color:#000000">val2</span>);
<span style="color:#aa5500">// 查看对象是否为空</span>
<span style="color:#000000">assertNull</span>(<span style="color:#000000">str3</span>);
<span style="color:#aa5500">// 查看两个数组是否相等</span>
<span style="color:#000000">assertArrayEquals</span>(<span style="color:#000000">expectedArray</span>, <span style="color:#000000">resultArray</span>);
}</span></span>
四、Junit注解
4.1 @Test
在junit4中,定义一个测试方法变得简单很多,只需要在方法前加上@Test就行了。
注意:测试方法必须是public void,即公共、无返回数据。可以抛出异常。
4.2 @BeforeClass
当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来,放在一个方法里,并为这个方法注解@BeforeClass。意思是在测试类里所有用例运行之前,运行一次这个方法。例如创建数据库连接、读取文件等。
注意:方法名可以任意,但必须是public static void,即公开、静态、无返回。这个方法只会运行一次。
例如:我们改造下HelloJunit的add方法(java包下),代码如下
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#0000ff">add</span>(<span style="color:#008855">int</span> <span style="color:#000000">one</span>, <span style="color:#008855">int</span> <span style="color:#000000">two</span>) {
<span style="color:#008855">int</span> <span style="color:#000000">sum</span> <span style="color:#981a1a">=</span> <span style="color:#000000">one</span> <span style="color:#981a1a">+</span> <span style="color:#000000">two</span>;
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"和为:"</span> <span style="color:#981a1a">+</span> <span style="color:#000000">sum</span>);
<span style="color:#770088">return</span> <span style="color:#000000">sum</span>;
}</span></span>
测试类(Test包下)加一个方法,代码如下
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">static</span> <span style="color:#008855">int</span> <span style="color:#000000">one</span>;
<span style="color:#770088">static</span> <span style="color:#008855">int</span> <span style="color:#000000">two</span>;
<span style="color:#555555">@BeforeClass</span>
<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#0000ff">beforeClass</span>() {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"@BeforeClass注解在测试方法之前运行"</span>);
<span style="color:#000000">one</span> <span style="color:#981a1a">=</span> <span style="color:#116644">2</span>;
<span style="color:#000000">two</span> <span style="color:#981a1a">=</span> <span style="color:#116644">3</span>;
}</span></span>
改造下addTest()方法
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">addTest</span>(){
<span style="color:#770088">new</span> <span style="color:#000000">HelloJunit</span>().<span style="color:#000000">add</span>(<span style="color:#000000">one</span>,<span style="color:#000000">two</span>);
}</span></span>
我们在来运行下,看下结果如何!!beforeClass方法先运行了
4.3 @AfterClass
跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如:清理数据,日志记录。
注意:同样必须是public static void,即公开、静态、无返回。这个方法只会运行一次
例如:增加一个afterClass测试方法,代码如下:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">static</span> <span style="color:#008855">int</span> <span style="color:#000000">afterSum</span>;
<span style="color:#555555">@AfterClass</span>
<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#0000ff">afterClass</span>() {
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"@AfterClass注解在测试方法之后运行"</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"afterSum="</span><span style="color:#981a1a">+</span><span style="color:#000000">afterSum</span>);
}</span></span>
改造下addTest()方法,代码如下
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">addTest</span>(){
<span style="color:#000000">HelloJunit</span> <span style="color:#000000">helloJunit</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">HelloJunit</span>();
<span style="color:#000000">helloJunit</span>.<span style="color:#000000">add</span>(<span style="color:#000000">one</span>,<span style="color:#000000">two</span>);
<span style="color:#000000">afterSum</span> <span style="color:#981a1a">=</span> <span style="color:#000000">helloJunit</span>.<span style="color:#000000">add</span>(<span style="color:#000000">one</span>,<span style="color:#000000">two</span>);
}</span></span>
我们在来运行下,看下结果如何!!afterClass方法最后运行了
4.4 @Before注解
与@BeforeClass的区别在于,@Before不止运行一次,它会在每个用例运行之前都运行一次。主要用于一些独立于用例之间的准备工作。
比如两个用例都需要读取数据库里的用户A信息,但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信息。
注意:必须是public void,不能为static。不止运行一次,根据用例数而定。
4.5 @After注解
@After与@Before对应
4.6 @Ignore注解
有时候我们想暂时不运行某些测试方法/测试类,可以在方法前加上这个注解。在运行结果中,Junit会统计忽略的用例数,来提醒你。但是不建议经常这么做,因为这样的坏处时,容易忘记去更新这些测试方法,导致代码不够干净,用例遗漏。使用此标注的时候不能与其它标注一起使用,如:和@Test 标注一起使用,那就没用了
例如
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Ignore</span>
<span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">ignoreTest</span>(){
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"忽略测试"</span>);
}</span></span>
4.7 @Runwith注解
首先要分清几个概念:测试方法、测试类、测试集、测试运行器。
其中测试方法就是用@Test注解的一些函数。
测试类是包含一个或多个测试方法的一个Test.java文件。
测试集是一个suite,可能包含多个测试类。
测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法。
而@Runwith就是放在测试类名之前,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器。
常见的运行器有:
-
@RunWith(Parameterized.class) 参数化运行器,配合@Parameters使用Junit的参数化功能
2.@RunWith(Suite.class)
@SuiteClasses({ATest.class,BTest.class,CTest.class})
测试集运行器配合使用测试集功能
3.@RunWith(JUnit4.class)
Junit4的默认运行器
4.一些其它运行器具备更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了spring的一些功能