赞
踩
百度百科:单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。
单元测试是编写测试代码,用以检测特定的、明确的、细颗粒的功能! 严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试。
目前开发所用的单元是Junit框架,在大多数java的开发环境中已经集成,可以方便开发自己调用!
注意:单元测试不仅仅是要保证代码的正确性,一份好的单元测试报告,还要完整地记录问题的所在和缺陷以及正确的状态,方便后面代码的修复,重构和改进!
一般来说,一份单元测试主要包括以下几个方面:
1.接口功能性测试: 接口功能的正确性,即保证接口能够被正常调用,并输出有效数据!
------------------> 是否被顺利调用
------------------> 参数是否符合预期
==============================================================================================
2.局部数据结构测试:保证数据结构的正确性
------------------> 变量是否有初始值或在某场景下是否有默认值
------------------> 变量是否溢出
3.边界条件测试:测试
------------------> 变量无赋值(null)
------------------> 变量是数值或字符
------------------> 主要边界:最大值,最小值,无穷大
------------------> 溢出边界:在边界外面取值+/-1
------------------> 临近边界:在边界值之内取值+/-1
------------------> 字符串的边界,引用 "变量字符"的边界
------------------> 字符串的设置,空字符串
------------------> 字符串的应用长度测试
------------------> 空白集合
------------------> 目标集合的类型和应用边界
------------------> 集合的次序
------------------> 变量是规律的,测试无穷大的极限,无穷小的极限
4.所有独立代码测试:保证每一句代码,所有分支都测试完成,主要包括代码覆盖率,异常处理通路测试
------------------> 语句覆盖率:每个语句都执行到了
------------------> 判定覆盖率:每个分支都执行到了
------------------> 条件覆盖率:每个条件都返回布尔
------------------> 路径覆盖率:每个路径都覆盖到了
==============================================================================================
5.异常模块测试,后续处理模块测试:是否包闭当前异常或者对异常形成消化,是否影响结果!
断言列表:
-------------->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) 要求执行的目标结构必然失败,同样要求代码不可达,即是这个方法在程序运行后不会成功返回,如果成功返回了则报错
用于在测试前、后做一些初始化、收尾工作,例如测试接口性能。
@Before
public void before(){
startTimeMillis=System.currentTimeMillis();
}
@After
public void after(){
endTimeMillis= System.currentTimeMillis();
System.out.println("【耗时】"+(endTimeMillis-startTimeMillis));
}
参数化测试的目标是为了一次性完成同类型测试,将相同类型的数据按照一定的顺序批量地传入测试方法,并得出结论!其本质是一个批量的化的操作,只是为了方便我们测试而进行了封装。我们只有提供测试的方法以及按照一定的顺序进行设置则可以。
@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返回并注解。
--------->参数初始化:设置测试方法要入参的参数,并按照"参数设置"的顺序利用构造方法进行初始化的赋值!
--------->测试调用:写一个测试方法进行调用,将参数传递到要测试的类的方法中并返回数据。
a. junit加载文件:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
b.手动加载方法:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"/spring/spring-mvc.xml","/spring/spring-redis.xml","/spring/spring-mybatis.xml","/spring/spring-main.xml"});
DeptMapper deptService = (DeptMapper) applicationContext.getBean("deptService");
a.使用MockMvc模拟通过url的接口调用。MockMvc是SpringMVC提供的Controller测试类,每次进行单元测试时,都是预先执行@Before中的setup方法,初始healthArticleController单元测试环境。示例代码如下。
b.postman+修改权限过滤条件
package testDao; import com.susq.mbts.controller.UserController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class ConTest { @Autowired private UserController userController; private MockMvc mockMvc; @Before public void setup(){ mockMvc = MockMvcBuilders.standaloneSetup(userController).build(); } @Test public void Ctest() throws Exception { ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/show_user3").param("id", "1")); MvcResult mvcResult = resultActions.andReturn(); String result = mvcResult.getResponse().getContentAsString(); System.out.println("=====客户端获得反馈数据:" + result); // 也可以从response里面取状态码,header,cookies... // System.out.println(mvcResult.getResponse().getStatus()); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。