`
beck5859509
  • 浏览: 108866 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

单元测试编写原则及如何使用jmockit

 
阅读更多
   通常在写单元测试时,最好以测试人员的身份进行编写,这样有利于早期的bug发现及代码重构。一般单元测试以业务场景为基础。每个场景单独进行测试,根据预测结果与实际返回值进行比对,得出程序功能是否正确。
  

费话不多说,直接上代码。以下描述一个完整的例子,以Junit 4为基础
1.类及方法
public class StockActionTest {
	/**
         *描述本用例的业务场所景
	 */
	@Test
	public void testGetSomething(){
StockActionTest类并不一定以Test结尾或开头,只是一种约定,Junit 4里面只要对方法进行@Test注解即可告诉测试框架需要测试该方法,而Junit 3中类需要继承TestCase,并且测试方法以test开头。

2.初始化、资源释放及回收
	/**
	 * 用例执行前的初始化等操作
	 * @throws Exception
	 */
	@Before
	public void setUp() throws Exception {
                initData();
		mockMethod();
	}

	/**
	 * 用例执行完毕后资源释放等操作
	 * @throws Exception
	 */
	@After
	public void tearDown() throws Exception {
		Mockit.tearDownMocks();
	}
以上两个方法均服务于每个测试方法,会在方法前和方法后执行,我们可以把初始化数据或者mock方法写在此处,另外方法执行完毕也可以写tearDown方法进行相关的释放。当然要视情况而定,如果资源初始化以后不会变的,可以写在@BeforeClass方法里面。

3.方法断言
//执行结果判断
StockAction sa = new StockAction();
QueryResult result = sa.getShift(motivation, "7", "021H", "1200");
//编码为021H02
Assert.assertEquals("021R1400", result.getBatchCode());
//工作日是周天
Assert.assertEquals("7", result.getTime());

这是最重要的一步,断言实际功能的返回值与预期的是否相同,Junit提供了assertEquals、assertTrue、assertFalse等方法。

4.如何mock
当程序中遇到第三方接口,数据库连接,文件读写等与业务逻辑不相干因素时,我们就得借助mock工具。在使用mock之前,我们还是有解决办法的。比如三方接口的场景。我们可以实现三方接口,但这样会造成实现类中很多空实现的方法,另外由于要查看三方的实现源码逻辑,会比较耗时。所以想到了mock工具。
Mock工具这里首选jmockit,因为该工具即能mock接口,也能mock静态方法,final方法等,这是其它工具jmock,easymock,mockito不能比拟的。

//要测试的类,该类里面引用了IMatcher三方接口
StockConnectorImpl sc

//通过Mocked关键字指定会生成代理matcher对象
@Mocked
IMatcher matcher;

private void mockMethod(){
    //将代理对象注入到测试类实例
    sc = new StockConnectorImpl(matcher);
    
    new MockUp<IMatcher>(){
    //mock代理对象的接口方法,返回你所想到要值
        @Mock
	public List<T> getSomething(String code){
		//doSomething
        }

    }.getMockInstance();
}

通过MockUp的匿名类生成代理对象的方法,运行时会执行里面的方法。
Jmockit还可以mock测试类本身的方法,当然不建议那样做。

new Expectations(sc){
{
	Deencapsulation.invoke(sc, "getBatchIds","021H");
	Set<String> result = new HashSet<String>();
	result.add("593406263");
	returns (result);
	}
};
另Expectations
的方式也可以进行mock,这种方法就其实是运用了反射

Mockit.tearDownMocks();

最后做还原动作, 确保用例之间不相互影响。

@RunWith(Suite.class)
@Suite.SuiteClasses({StockActionTest.class})
public class RouteTestAll {
	
}

添加StockActionTest到测试套,以便可以执行多个测试用例。后续新用例,只用往StockActionTest.class添加。

结合Coverage插件,可以更清楚的了解代码编写的质量。
0
0
分享到:
评论

相关推荐

    使用JMockit编写java单元测试

    之前《有效使用Mock编写java单元测试》一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具——JMockit。引用单元测试中mock的使用及mock神器jmockit实践中的java单元测试中各种...

    轻松编写 C++ 单元测试(gtest)

    单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好 的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的

    Linux下使用C++编写的并发服务器,redis缓存和MySQL数据库,GoogleTest单元测试和webbench压力测试

    spark一个Linux下使用C++学习编写的并发服务器,使用redis作为缓存和MySQL作为数据库,并利用GoogleTest编写单元测试和webbench进行压力测试。.zipspark一个Linux下使用C++学习编写的并发服务器,使用redis作为缓存...

    产品手册-SmartUnit单元测试工具.pdf

    单元测试现状 汽车电子嵌入式单元测试 SmartUnit系列产品介绍 SmartUnit Air 智能化单元测试用例设计工具 SmartUnit Rocket ...对于需要达到MC/DC100%覆盖的工程,需要耗费大量的人力及时间来编写用例。

    junit(单元测试)入门

    单元测试概念 被测系统:SUT(System Under Test):表示正在被测试的系统,目的是测试系统能够正确操作 ★测试夹具:(Test Fixture):就是测试运行程序会在测试方法之前自动初始化、回收资源的工作。 Junit4引入的...

    测试方案编写模板包括单元测试、集成测试系统测试等.doc

    测试方案编写模板包括单元测试、集成测试系统测试等.doc

    Junit单元测试的实验报告.docx

    简单介绍了Junit的安装过程与实例应用。应用的问题是软件测试中的佣兵问题,整个文档中有代码及测试结果,可以更好地帮助学生了解Junit单元测试中的作用。

    java成都新锐科技发展有限责任公司,单元测试编写规范

    成都新锐科技发展有限责任公司,单元测试编写规范

    单元测试实例代码

    (C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...

    单元测试方案.txt

    测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元 测试是十分必要的。 单元测试( Unit Test ,模块测试)是开发者...

    Google的开源C++单元测试框架Google Test使用教程

    我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。 其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试...

    单元测试计划--单元测试计划模板

    本资源是单元测试计划的模板,对于编写单元测试计划有帮助

    单元测试计划模板

    【此处描述根据项目的具体特征所确定的代码走查及单元测试的策略(如:代码走查在本项目重点关注的地方、测试可行性分析,测试方法确定,测试类型选择)】 类型 【此处描述单元测试选择的测试类型,一般建议有...

    thinkphp单元测试手册.pdf

    千盼万盼,在ThinkPHP 5.X中终于支持单元测试了,一举解决了TP进行单元测试的...本手册的编写目的主要是为了方便大家了解TP,并且能够指引大家在实际项目中使用单元测试,更甚至能 够将测试驱动应用到实际项目当中。

    Junit单元测试所需要的两个jar包

    单元测试:程序猿编写的一小段代码,用来对某个类中的某个方法进行功能测试或业务逻辑测试。 3 Junit单元测试框架的作用以及好处. 用来对类中的方法功能进行有目的的测试,以保证程序的正确性和稳定性。 能够让方法...

    数据库操作的单元测试

    3.1.4. 编写全面的测试。 4 3.1.5. 创建稳定、有意义的测试数据集。 5 3.1.6. 创建专用的测试库。 6 3.1.7. 有效地隔离测试。 7 3.1.8. 分割测试套件。 8 3.1.9. 使用适当的框架(如 DbUnit)简化过程。 9 3.2. ...

    VS2010单元测试工具使用

    目录: 1、建立单元测试项目 2 1.1、从被测试代码生成单元测试 2 ...2、编写测试方法 7 3、数据驱动的单元测试 8 3.1、ACCESS数据驱动单元测试 8 3.2、读取Excel的方法: 11 4、单元测试的运行 14 5、附加测试属性 15

    如何编写干净的单元测试用例

    火龙果软件工程技术中心 篇首语本文假设读者已经熟悉单元测试及JUnit工具的使用,如果对单元测试及JUnit尚不了解请先学习单元测试及JUnit工具的相关知识。读者最好对Spring框架及Spring框架提供的单元测试支持有所...

Global site tag (gtag.js) - Google Analytics