单元测试之道-学习笔记

学习单元测试之道-java版学习笔记

[color=red]一.单元测试[/color]
[b]1.定义[/b]
单元测试:实开发者编写的一小段程序.

[b]2.目的:[/b]
1)用于检验被测代码的一个很小的,很明确的功能是否正确.
2)从效果上而言,它就像能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能..

[b]3.如何进行单元测试[/b]
首先要考虑在编写这些测试方法之前,如何测试那些可疑的方法,可以在编写实现代码时,或之前编写测试代码本省
下一步,新写的测试通过,同时不会影响其他测试,确保系统所有测试都能通过.

总结一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为.
你需要确认:在任何情况下,这段代码是否都和你的期望一致,譬如在参数很可疑,硬盘没有剩余空间,网络掉线的时候

[color=red]二.Junit[/color]
[b] 1. Junit的各种断言[/b]
[code]
//相等性测试
assertEquals([message],expected,actual)

//验证一个对象是否为null
assertNull([message],java.langobject object)

//验证expected参数和actual参数所引用的是否为同一个对象
assertSame([message],expected,actual)


//验证给定的二元条件是否为真.
assertTrue([message],boolean condition)

//会使测试立即失败,这种断言通常用于标记某个不应该到达的分支.
fail([message])

[/code]
[b]2.Junit框架[/b]
[b]1)一个简单例子[/b]
每个包含测试的类需要继承TestCase类.而所有一test开头的方法都会被junit自动运行[code]
import junit.framework.TestCase
public class BaseTest extends TestCase
{
protected Log logger = LogFactory.getLog(getClass());

@SuppressWarnings("unchecked")
protected void echoList(List list)
{
System.out
.println("\n===============================================================");
System.out.println("list size = " + list.size() + "\n");
for (Object obj : list)
{
System.out.println("obj = " + obj);
}
System.out
.println("==================================================================\n");
}
protected void echo(Object obj)
{
System.out.println(obj);
}
Protected void setup()
{…
}
Protected void teardown();
{….
}
}[/code]
[b]2)suite方法[/b]
当然,也可以通过创建test suite()静态方法,可以将一系列的测试方法组合起来
比如一些耗时的方法可以选择不运行.
这里不在详细介绍.

[b]3)Setup和tearDown方法[/b]
[code]
//测试之前用于环境的建立,准备一些资源
Protected void setup()
//释放资源,清理环境
Protected void teardown();[/code]

[color=red]三.测试的礼貌[/color]
避免一下情况
1.不完整代码(仅签入一个类文件,而忘记签入它所依赖的其他文件
2.不能编译的代码
3.代码能编译,但是会破坏已存在的代码
4.没有相应单元测试的代码
5.不能通过单元测试的代码
6.通过了单元测试,但是导致系统其他地方的其他测试失败的代码.
[color=red]
四.使用Mock对象测试[/color]
因为一些方法真实的运行场景难于确定,所以写”替身方法”实现要测试的方法,Mock真正的环境,Mock对象就是真是对象在调试期的替代品.
借助Mock对象,可以解决一下问题
1..真实对象具有不可确定的行为(产生不可预测的结果,如股票行为)
2.真实对象很难被创建
3.真是对象的某些行为很难触发(如网络错误)
4.真实对象令程序运行速度很慢
5.真是对象有或者是用户界面
6.测试需要询问真是对象它是如何被调用的(如测试可能需要验证某个回调函数是否被调用了)
7.真是对象实际上并不存在(当需要和其他开发小组,或者新硬件系统打交道的时间这是一个普通问题).
完整的中文版《单元测试C#版》。单元测试不但会使你的工作完成得更轻松,而且会令你的设计变得更好,甚至大大减少你花在调试上面的时间。 在我们上面的小故事里面,Pat 因为假设底层的代码是正确无误的而卷入麻烦之中,先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。在对这些代码的行为没有任何信心的前提下,Pat 等于是在假设上面用竖立卡片堆砌了一间房子——只要将下面卡片轻轻移动,整间房子就会轰然倒塌。 当基本的底层代码不再可靠时,那么必需的改动就无法只局限在底层。虽然你可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码,于是高层代码也连带地需要修改;以此递推,就很可能会动到更高层的代码。于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。于是,整间由卡片堆成的房子就由此倒塌,从而使整个项目也以失败告终。 Pat 总是说:“这怎么可能呢?”或者“我实在想不明白为什么会这样”。如果你发现自己有时候也会有这种想法,那么这通常是你对自己的代码还缺乏足够信心的表现——你并不能确认哪些是工作正常的而哪些不是。 为了获得Dale 所具有的那种对代码的信心,你需要“询问”代码究竟做了什么,并检查所产生的结果是否确实和你所期望的一致。 这个简单的想法描述了单元测试的核心内涵:这个简单有效的技术就是为了令代码变得更加完美。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值