测试简介

这里所说的测试主要是指单元测试,一般说Java的单元测试都知道有个Junit。确实目前很多公司,无论什么行业,基本都是使用junit进行单元测试,一般银行、电信、股票项目每个功能类都必须有相应的单元测试类,而且测试用例也是极其苛刻的。而且每一行代码都需要有log追踪。生成的测试报告也要成为相应的成果物交与甲方。稍微差一点的,单元测试也就是一个形式,因为很多情况(由以国内政务项目为主)都是业务逻辑集成UI功能都做完了,之后再回去补单元测试,其实是为了应付甲方合同中的测试报告。话说多了,偏离了主题。Maven构建项目的时候可以执行我们的单元测试,底层是调用了Maven的插件maven-surefire-plugin执行单元测试用例。

新模块的需求与开发

再展示Maven的测试功能之前,我们先来开发一个新的模块,随机验证码的功能模块。随机验证码我们在网上都用过,在此不再详细说了,直接看代码即可。此处用到了一个google开源的组件。这个在笔者的另一篇blog

http://suhuanzheng7784877.iteye.com/blog/1076066中有介绍,在此不再赘述。

先来看生成随机数业务代码

AccountImageUtil


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因



1. package
2.   
3. import
4. import
5. import
6. import
7.   
8. import
9. import
10.   
11. public class
12.   
13. static DefaultKaptcha defaultKaptcha = new
14. static
15. static int key = 0;  
16. static
17. static
18. new Config(new
19. new
20. new
21.     }  
22.   
23. public static
24. new
25.   
26. for (int i = 0; i < 4; i++) {  
27. int a = random.nextInt(10);  
28.             sb.append(a);  
29.         }  
30.         map.put(key, sb.toString());  
31.         key++;  
32. return
33.     }  
34.   
35. }


  以上业务辅助类初始化了图片生成组件,之后调用随机函数类生成四位的随机数。

再来看看生成图片的类AccountImageServiceImpl,接口不再给出了


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


1. package
2.   
3. import
4. import
5. import
6. import
7. import
8. import
9.   
10. import
11.   
12. public class AccountImageServiceImpl implements
13.   
14. @Override
15. public byte[] generateText() {  
16.   
17.         BufferedImage bufferedImage = AccountImageUtil.defaultKaptcha  
18.                 .createImage(AccountImageUtil.generateText());  
19.   
20. new
21.   
22. try
23. "jpg", out);  
24. catch
25. // TODO Auto-generated catch block
26.             e.printStackTrace();  
27.         }  
28.   
29. new File("c:/1.jpg");  
30. try
31. new
32.             fileOut.write(out.toByteArray());  
33. catch
34. // TODO Auto-generated catch block
35.             e.printStackTrace();  
36. catch
37. // TODO Auto-generated catch block
38.             e.printStackTrace();  
39.         }  
40.   
41. return
42.   
43.     }  
44.   
45. public
46.         String value = AccountImageUtil.map.get(key);  
47. return
48.     }  
49.   
50. @Override
51. public boolean
52.   
53.         String value = AccountImageUtil.map.get(key);  
54.   
55. return
56.     }  
57. }


 这个类就是调用辅助类生成图片的。下面我们编写单元测试。

3.  新模块的测试

AccountImageUtilTest代码如下


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因

1. package
2. import static
3. import
4.   
5. public class
6.   
7. @Test
8. public void
9.         String value = AccountImageUtil.generateText();  
10. "1111".equals(value));  
11.     }  
12.   
13. }


 AccountImageServiceImplTest如下


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因



1. package
2. import static
3. import
4. public class
5.   
6. new
7.   
8. @Test
9. public void
10.   
11. byte[] b = accountImageServiceImpl.generateText();  
12.   
13. null);  
14.   
15.     }  
16.   
17. @Test
18. public void
19. 0);  
20. "---------------------------------"
21. "0000"));  
22.     }  
23.   
24. }


之后在控制台运行如下指令


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


1. mvn test


 之后效果如下


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因



1. -------------------------------------------------------  
2.  T E S T S  
3. -------------------------------------------------------  
4. Running com.liuyan.account.mail.AccountImageServiceImplTest  
5. ---------------------------------1990
6. Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.926
7. Running com.liuyan.account.mail.AccountImageUtilTest  
8. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001
9.   
10. Results :  
11.   
12. Tests run: 3, Failures: 0, Errors: 0, Skipped: 0


 运行报告是junit自己的报告输出,和咱们在Eclipse运行的报告差不多。以上代表运行了3个用例,和预期效果不符的是0个,失败的用例是0个,忽略的用例数是0个。

如果需要跳过单元测试,则可以运行如下命令


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因




1. mvn package


 大家可能要问,为何Maven能够自己寻找我们编写的测试类呢?其实还是那句约定大于配置。Maven自动去寻找src/test/java下面的类,当此文件夹下面的类符合以下规范,那么Maven默认认为他们是单元测试用例类。

Test*.java:任何目录下以Test为开始的类

*Test.java: 任何目录下以Test为结尾的类

*TestCase.java: 任何目录下以TestCase为结尾的类。

如果想在一段时间内节省项目构建时间,暂时全部忽略单元测试。那么可以在pom.xml中配置如下


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因



1. <build>  
2.     <plugins>  
3.         <plugin>  
4.             <groupId>org.apache.maven.plugins</groupId>  
5.             <artifactId>maven-surefire-plugin</artifactId>  
6. 2.5</version>  
7.             <configuration>  
8. true</skipTests>  
9.             </configuration>  
10.         </plugin>  
11.     </plugins>  
12. </build>


 等到项目完全开发完了,需要测试用例的时候将其注释掉即可。

本个模块有两个测试用例类,如果仅仅想运行一个测试用例该怎么办。运行下面命令


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


1. test -Dtest=AccountImageServiceImplTest

 这个是指定具体运行哪个测试用例。当然需要将pom文件中忽略测试用例的配置注释掉。

也可以测试多个测试用例


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


1. mvn test -Dtest=AccountImageServiceImplTest,AccountImageUtilTest

也可以使用模糊匹配进行测试


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


1. mvn test -Dtest=*Test

  我们也可以通过pom文件配置我们想要测试的类与不想测试的类


Java代码  

mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因


    1. <build>  
    2.     <plugins>  
    3.         <plugin>  
    4.             <groupId>org.apache.maven.plugins</groupId>  
    5.             <artifactId>maven-surefire-plugin</artifactId>  
    6. 2.5</version>  
    7.             <configuration>  
    8.                 <includes>  
    9. /*Test.java</include>
    10.                 </includes>
    11.                 <excludes>
    12.                     <exclude>**/AccountImageUtilTest.java</exclude>  
    13.                 </excludes>  
    14.             </configuration>  
    15.         </plugin>  
    16.     </plugins>  
    17. </build>


     includes是需要测试的类,excludes是要排除之外测试用例。可以使用模糊匹配。**用来匹配任意件路经,*匹配任意类。

    4.  测试报告

    基本的测试报告上面已经介绍过了,下面我们看看测试覆盖率的报告。运行如下命令


    Java代码  

    mvn test没有触发单元测试的原因 maven单元测试_mvn test没有触发单元测试的原因




    1. mvn cobertura:cobertura


     在target文件夹下出现了一个site目录,下面是一个静态站点,里面就是单元测试的覆盖率报告。


    mvn test没有触发单元测试的原因 maven单元测试_maven测试_14

    5.  总结

    这次我们介绍了Maven的测试,可以运行项目的单元测试用例,并生成报告。使用者可以根据自己的需要配置测试选项以满足项目的测试需求。最后说一下,测试十分重要,往往大手笔的产品测试人员和开发人员的比例是2:1。