1、何为单元测试
作为一个第一次使用单元测试的童鞋,还是有必要了解下何为单元测试,单元测试有啥好处!
在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
单元测试的好处在于以下几点:
1、隔离程序部件并证明这些单个部件是正确的。一个单元测试提供了代码片断需要满足的严密的书面规约。因此,单元测试带来了一些益处。 单元测试在软件开发过程的早期就能发现问题。
2、单元测试提供了系统的一种文档记录。借助于查看单元测试提供的功能和单元测试中如何使用程序单元,开发人员取得了程序单元API的基础直观的理解。
3、单元测试允许程序员在未来重构代码,并且确保模块依然工作正确(复合测试)。这个过程就是为所有函数和方法编写单元测试,一旦变更导致错误发生,借助于单元测试可以快速定位并修复错误。
2、android单元测试介绍
junit.framework.TestCase
测试与Android环境无关的接口,可以继承自此类,例如对纯粹的日期格式转换等接口的测试。这种通过接口测试通常用于一个工具类的功能测试。
比如:
public class HelloTestextends InstrumentationTestCase {
Hello mActivityTested;
public HelloTest(){
}
@Override
protected void setUp() throws Exception {
Intent intent =new Intent();
intent.setClassName("com.xmobileapp.hello",Hello.class.getName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivityTested = (Hello)getInstrumentation().startActivitySync(intent);
}
继承InstrumentationTestCase测试类的特点是需要将被测试项实例化。
当你拿到mActivityTested这个实例后,就可以调用该类里面相应的方法来验证是否是符合你的预期。
如果时要做与activity相关或者时需要context上下文的时候就需要继承ActivityInstrumentationTestCase2<T>将activity传进去。
比如:
publicclass TestApp extends ActivityInstrumentationTestCase2<AddUT> {
public TestApp()
{
super("com.xmobileapp", AddUT.class);
}
public void testSum()
{
assertEquals(5, getActivity().add(2, 3));
}
}
3、如何使用android单元测试:
这个有很多博客写了,我附一个链接吧
如何进行单元测试:http://www.cnblogs.com/feisky/archive/2010/07/23/1783826.html
camera系统的单元测试分析:http://mintelong.iteye.com/blog/460903
4、注意事项
4.1 测试的方法一定要是public的,不然会报错
4.2 如果是执行异步的操作,在测试方法中要将线程先wait,然后执行完成后调用notify去操作,比如:
private final Integer LOCK = 1;
public void test() throws Exception {
……异步操作的回掉方法
synchronized(LOCK){
LOCK.notify();
}
try{
synchronized(LOCK) {
LOCK.wait();
}
}catch(InterruptedException e) {
Assert.assertNotNull(e);
}}
测试中常用的方法
AndroidTestCase.getContext():
此函数的功能为得到Android系统的上下文对象,通过它可以取得contentResolver等对象。
ActivityInstrumentationTestCase.getActivity()
此函数的功能为得到被测Activity对象
assertTrue(String message,boolean condition)
声明状态是True
assertFalse(String message,boolean condition)
声明状态是False
assertEquals(String message,T expected,T expected)
声明两个对象相等
assertNotNull(String message,Object object)
声明对象不为空
assertNull(String message,Object object)
声明对象为空
fall(String message)
测试失败并附带一条消息