1、单元测试的目的?
单元测试是编写测试代码,用以检测特定的、明确的、细颗粒的功能! 严格来讲,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试。如今通常公司都会进行业务流程的测试,这也要求测试人员须要了解需求! 测试人员也很差过啊~~java
目前开发所用的单元是Junit框架,在大多数java的开发环境中已经集成,能够方便开发本身调用!数组
注意:单元测试不只仅是要保证代码的正确性,一份好的单元测试报告,还要完整地记录问题的所在和缺陷以及正确的状态,方便后面代码的修复,重构和改进!数据结构
2、单元测试作什么?框架
通常来讲,一份单元测试主要包括如下几个方面:单元测试
==============================================================================================
1.接口功能性测试: 接口功能的正确性,即保证接口可以被正常调用,并输出有效数据!测试
------------------> 是否被顺利调用ui
------------------> 参数是否符合预期this
==============================================================================================
2.局部数据结构测试:保证数据结构的正确性
------------------> 变量是否有初始值或在某场景下是否有默认值
------------------> 变量是否溢出
==============================================================================================
3.边界条件测试:测试
------------------> 变量无赋值(null)
------------------> 变量是数值或字符
------------------> 主要边界:最大值,最小值,无穷大
------------------> 溢出边界:在边界外面取值+/-1
------------------> 临近边界:在边界值以内取值+/-1
------------------> 字符串的边界,引用 "变量字符"的边界
------------------> 字符串的设置,空字符串
------------------> 字符串的应用长度测试
------------------> 空白集合
------------------> 目标集合的类型和应用边界
------------------> 集合的次序
------------------> 变量是规律的,测试无穷大的极限,无穷小的极限
==============================================================================================.net
4.全部独立代码测试:保证每一句代码,全部分支都测试完成,主要包括代码覆盖率,异常处理通路测试
------------------> 语句覆盖率:每一个语句都执行到了
------------------> 断定覆盖率:每一个分支都执行到了
------------------> 条件覆盖率:每一个条件都返回布尔
------------------> 路径覆盖率:每一个路径都覆盖到了对象
==============================================================================================
5.异常模块测试,后续处理模块测试:是否包闭当前异常或者对异常造成消化,是否影响结果!
3、JAVA的单元测试JUNIT4
(1):业务流程的通常是按照需求的预期效果,跑完整个业务流程,包括之前开发的流程
-----------------> 是否实现了预期
-----------------> 是否影响到了之前的流程
-----------------> 全流程是否顺利
-----------------> 数据是否符合预期
==============================================================================================
(2):代码测试:
@BeforeClass 全局只会执行一次,并且是第一个运行
@Before 在测试方法运行以前运行
@Test 测试方法
@After 在测试方法运行以后容许
@AfterClass 全局只会执行一次,并且是最后一个运行
@Ignore 忽略此方法
JUNIT4是以org.junit为框架进行的测试,以注解的形式来识别代码中须要测试的方法!
注意:
对于每个测试,咱们都应该保持独立测试,以确保测试结果是有意义的。在程序中,常常会出现,当测试完一个方法后,其参数已经被系统保持或持久化下来。无疑会形成下一次的测试测试数据或者状态的不合理性!为了解决问题,对于此类场景,咱们的测试代码必须具有初始化和收尾的能力。也便是@Before和@After的意义所在!
同理@AfterClass和BeforeClass便是为了知足测试中,那些体积很是大,但只要一次初始化的代码块!
(3):断言测试与及经常使用断言:
---------->assertEquals:
Assert.assertEquals("此处输出提示语", 5, result);
===================================================================================================================
解析:"此处输出提示语" 为错误时你我的想要输出的错误信息; 5 是指你指望的值;result 是指你调用程序后程序输出给你的结果
@Test(expected = NullPointerException.class)
解析:在注解的时候添加expected 为忽略此异常
@Test(timeout = 5000 ):超时设置
@Test(expected = XXXXException. class):指望出现异常,若是出现该异常则成功,不然测试失败
@Ignore() :用户方法之上,被注解的方法会被成功需忽略
===================================================================================================================
fail("Not yet implemented")
解析:放在方法中,若是我顺利地执行,我就报失败出来。就是说按道理不该该执行到这里的,可是恰恰执行了,说明程序有问题
===================================================================================================================
Assert.assertTrue("msg",boolean)与Assert.assertFalse("msg",boolean)
解析:若是和预期同样为true则成功,不然失败输出msg;若是和预期同样为false则成功,不然失败并输出
----------> assertNull("msg",boolean)与assertNotNull("msg",boolean)
解析:assertNull与assertNotNull能够验证所测试的对象是否为空或不为空,若是和预期的相同则测试成功,不然测试失败!
========================================主要经常使用方法============================================
断言列表:
-------------->assertTrue(String message, boolean condition) 要求condition == true
-------------->assertFalse(String message, boolean condition) 要求condition == false
-------------->assertEquals(String message, XXX expected,XXX actual) 要求expected指望的值可以等于actual
-------------->assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
-------------->assertNotNull(String message, Object object) 要求object!=null
-------------->assertNull(String message, Object object) 要求object==null
-------------->assertSame(String message, Object expected, Object actual) 要求expected == actual
-------------->assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
-------------->assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true
-------------->fail(String message) 要求执行的目标结构必然失败,一样要求代码不可达,便是这个方法在程序运行后不会成功返回,若是成功返回了则报错
(4):运行器指定?
单元测试中,每一个类都是因为JUNIT4框架中的Runner运行器来执行的。通常状况下,在没有指定运行器的时候,是由系统默认选择(TestClassRunner)的运行器执行。包括类中的全部方法都是由该运行器负责调用和执行。当咱们须要指定的时候,则经过类级别注解 @Run Wirth(xxxxxx)进行选择,通常是根据不一样类型选择不一样执行器,能够提升效率也能够应用于某种特殊场景!
(5):参数化测试?
@RunWith(Parameterized. class )
public class TestParam {
private static Calculator calculator = new Calculator(); //须要测试的类
private int param;
private int result;
@Parameters
public static Collection data(){
return Arrays.asList(new Object[][] {{ 11 , 17 } , { xx1 , xx} } );
}
//有参构造,在实例的时候实现参数初始化
public TestParam( int param, int result){
this .param = param;
this .result = result;
}
@Test
public void TestResult(){
calculator.square(param);
assertEquals(result, calculator.getResult());
}
}
解说:参数化测试的目标是为了一次性完成同类型测试,将相同类型的数据按照必定的顺序批量地传入测试方法,并得出结论!其本质是一个批量的化的操做,只是为了方便咱们测试而进行了封装。咱们只有提供测试的方法以及按照必定的顺序进行设置则能够。
--------->进行类注解:@RunWith(Parameterized.class),为了测试类指定一个ParameterizedRunner运行器
--------->进行参数设置:将测试结果和指望结果,以每一组都是一个数组的形式存放以造成二维数组,转化为list返回并注解。
--------->参数初始化:设置测试方法要入参的参数,并按照"参数设置"的顺序利用构造方法进行初始化的赋值!
--------->测试调用:写一个测试方法进行调用,将参数传递到要测试的类的方法中并返回数据
注意:参数化测试须要建立一单独用于测试的测试类。并定义两个变量用于接受测试结果和预期目标。数据存放以二维数组的方式,两个为一组。接着即是经过构造方法进行数据初始化。 构造方法入参的顺序要和二维数组中国每一组存放的数据顺序保持一致。
(6):打包测试?
@RunWith(Suite. class )@Suite.SuiteClasses( {CalculatorTest. class ,SquareTest. class } )public class AllCalculatorTests { //to do something;} ==========================================================================================================================解析:将有须要的一块儿执行程序一块儿打包,而后执行运行器:Suite. class解析:咱们把须要打包一块儿测试的测试类做为参数传递给该注解。而后直接运行代码,此处的测试类能够直接设置为空,只须要添加注解便OK;————————————————版权声明:本文为CSDN博主「琼歌」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/qq_36505948/article/details/82797240