java程序员如何编写更好的单元测试?


一般来说 。Java程序员要编写更好的单元测试 。可以从以下7个方面改善:
1、首先需要全面了解软件开发测试的类型 。单元测试用于测试各个代码组件 。并确保代码按照预期的方式工作 。
2、使用框架来用于单元测试 。Java提供了若干用于单元测试的框架 。TestNG和JUnit是最流行的测试框架
3、谨慎使用测试驱动开发 。测试驱动开发(TDD)是一个软件开发过程 。在这过程中 。在开始任何编码之前 。我们基于需求来编写测试 。由于还没有编码 。测试最初会失败 。然后写入最小量的代码以通过测试 。然后重构代码 。直到被优化 。
4、测量代码覆盖率 。代码覆盖率衡量(以百分比表示)了在运行单元测试时执行的代码量 。通常 。高覆盖率的代码包含未检测到的错误的几率要低 。因为其更多的源代码在测试过程中被执行 。
5、尽可能将测试数据外部化 。在JUnit4之前 。测试用例要运行的数据必须硬编码到测试用例中 。这导致了限制 。为了使用不同的数据运行测试 。测试用例代码必须修改 。
6、善用JUnit 。与TestNG类似 。测试数据也可以外部化用于JUnit 。
7、使用断言而不是Print语句 。许多新手开发人员习惯于在每行代码之后编写System.out.println语句来验证代码是否正确执行 。这种做法常常扩展到单元测试 。从而导致测试代码变得杂乱 。除了混乱 。这需要开发人员手动干预去验证控制台上打印的输出 。以检查测试是否成功运行 。更好的方法是使用自动指示测试结果的断言 。
其他观点:
近段时间 。公司预备推动单元测试以提高转测代码的质量 。借鉴学习一些测试大佬的经验自己试了一把 。小测我在此写下初写单元测试的心得 。希望能和大家交流交流单元测试技术!
一、概述
1、 单元测试(模块测试)是开发者编写的一小段代码 。用于检验被测代码的一个很小的、很明确的功能是否正确 。
2、一般认为 。在结构化程序时代 。单元测试所说的单元是指函数 。在当今的面向对象时代 。单元测试所说的单元是指类 。以我的实践来看 。以类作为测试单位 。复杂度高 。可操作性较差 。因此仍然主张以函数作为单元测试的测试单位
3、有一种看法是 。只测试类的接口(公有函数) 。不测试其他函数 。从面向对象角度来看 。确实有其道理 。但是 。测试的目的是找错并最终排错 。因此 。只要是包含错误的可能性较大的函数都要测试 。跟函数是否私有没有关系
二、单元测试设计思想
1、单元测试可以借鉴类似功能测试的思想来进行设计
2、一个待测试类当作一个功能块 。待测试类当中的方法当作一个小的功能点 。
单元测试就理解为对这个待测试方法进行场景设计 。编写代码 。查看执行各场景结果和场景覆盖率
3、单元测试场景设计可以采用因果分析的方法 。将各个参数的组合当作各条件组合 。将输入参数后执行方法的结果当作是各条件组合后的结果
三、单元测试设计(采用因果分析法)
1、确定待测试模块即建立测试类
Game类及对应的Game测试类
package test.testDemo;public class Game {public String winGame(int num1,int num2) {int num=num1-num2;String txt=null;if(num>0) {txt=\"夺奖成功!\";}else if(num==0) {txt=\"安慰奖!\";}else {txt=\"夺奖失败!\";}return txt;}}package test.testDemo;import static org.junit.Assert.*;import org.junit.Test;public class GameTest {@Testpublic void testWinGame() {fail(\"Not yet implemented\");}}
2、分析因果条件列出场景并进行用例设计

java程序员如何编写更好的单元测试?

文章插图
3、单元测试用例编写
3.1 参数化
3.1.1 引入待测试类 。定义参数
3.1.2 引入注解@RunWith(Parameterized.class)参数化测试类
3.1.3 编写需用到的参数的构造函数
3.1.4 编写参数数据初始化方法
package test.testDemo;import java.util.Arrays;import java.util.Collection;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;//引入注解@RunWith(Parameterized.class)参数化测试类@RunWith(Parameterized.class)public class GameTest {//引入待测试类 。定义参数private Game game=new Game();private int num1;private int num2;private String expected;//编写需用到的参数的构造函数public GameTest(int num1, int num2,String expected) {super();this.num1 = num1;this.num2 = num2;this.expected=expected;}//编写参数数据初始化方法@Parameterspublic static Collection<Object[]> data(){return Arrays.asList(new Object[][] {{2,1,\"夺奖成功!\"},{2,2,\"安慰奖!\"},{1,2,\"夺奖失败!\"}});}@Testpublic void testWinGame() {}}

推荐阅读