android培训
Unit Testing
单元测试基础
1、Java单元测试框架:JUnit(Eclipse默认安装)、TestNG
2、单元测试目的:判断程序的执行结果与自己的期望结果是否一致
3、口号:keep the bar green,keep the code clean
4、单元测试的任务:
1)接口功能测试:保证接口功能的正确性
2)边界条件测试:当变量是数值,测试主要边界:最大值、最小值、无穷大,测试溢出边界:最大值+1,最小值-1,测试临近边界:最大值-1,最小值+1;当变量是字符串,测试空字符串,对字符串长度应用“数值变量”的边界;当变量是集合,测试空集合,对集合大小应用“数值变量”的边界
3)代码覆盖率测试:语句覆盖、分支覆盖、条件覆盖、路径覆盖等
Java代码覆盖率分析工具:Cobertura,Emma:Eclipse插件Eclemma,Jacoco
5、圈复杂度(Cyclomatic Complexity):衡量一个模块判定结构的复杂程度,圈复杂度大说明程序代码的判断逻辑复杂,难以测试和维护,计算方法:V(G)=e-n+2,其中e表示控制流图中的边的数量,n表示控制流图中节点的数量。圈复杂度的直观计算:V(G)=判定节点数(P)+1 = 区域数,比如下面的代码,圈复杂度为2
Java圈复杂度分析工具:Eclipse插件Metrics
JUnit 3.8
1、JUnit的最佳实践经验:
1)新建名为test的source folder,用于存放测试源代码
src和test分别是两个source folder,程序发布的时候略去test文件夹,但是目标类和测试类生成的.class文件能都在bin目录
2)虽然被测源代码和测试源代码在不同的source folder,但是应在source folder里面建立同名的包,这样测试源代码能够访问源代码里pulic,protected和default的类文件
3)测试类的命名规则:XxxxTest或者TestXxxx
2、在JUnit 3.8中,需要满足:
1)测试类,如XxxxTest必须继承TestCase(TestCase继承Assert)
2)测试方法(测试用例)的4大特点:public、void、无参数 、方法名称以test开头
(其实在文档中给出了说明,更深一步的理解是通过查看源代码)
比如,对待测方法divide():
我们可以设计多个测试用例,如测试正常情况和除数为0的情况:
测试正常的情况:
测试除数为0的情况:
3、测试用例(Test Case)的设计是单元测试的一个重要方面
1)Test Case 之间一定要保持完全的独立性,互补干扰
2)每个Test Case 只完成一项测试任务,测试通过的标准就是完成任务
4、Eclipse集成的测试工具:
测试成功:
测试失败:
5、Eclipse能直接新建JUnit Test Case
6、JUnit本身自带的测试方式:
1)junit.textui.TestRunner.run(CalculatorTest.class);
测试成功:
2)junit.awtui.TestRunner.run(CalculatorTest.class);
测试成功:
7、当被测试的方法是private方法:
答:利用反射(reflection)机制,记住:No reflection,no more framework,比如:
待测试方法:
测试用例:
8、TestSuit:自动执行测试套件里面所有的测试用例
10、在codes文件夹里给出了具体的测试练习
11、JUnit中的失败(failure)和错误(error),error指的是代码中抛出了异常等影响代码正常执行的情况,比如抛出了ArrayOutOfBoundsException,failure指的是assert所期待的结构与程序实际执行的结果不一致,或者直接调用了fail()方法
12、对测试类来说,如果一个测试类中有5个测试方法,那么JUnit就会创建5个测试类的对象,每一个对象只会调用一个测试方法,并且执行测试方法之前,需要先判断测试方法是否是public void no-arg no-return
JUnit 4.4
1、JUnit 4全面引入Annotation来执行编写的测试用例,体会到Annotation的重要性
2、JUnit 4 不要求测试类继承TestCase,测试方法名无需以test开头(最好以test开头),但是需要通过Annotation机制(Annotation Type Test)标识这是一个测试用例,所有被@Test注解所修饰的public void方法都是test case,可被JUnit所执行,比如:
3、JUnit 3.8中的setUp和tearDown,在JUnit 4.4中由Annotation Type Before和Annotation Type After所取代,比如:
4、JUnit 4有全局初始化(@BeforeClass)和全局销毁方法(@AfterClass)修饰public static void no-arg的方法,被@BeforeClass注解所修饰的方法会在所有测试方法执行前执行1次,被@AfterClass注解所修饰的方法会在所有测试方法执行后执行1次,通常这两个注解用于昂贵的资源,比如:数据库连接
5、参数化测试(Parameters):当一个测试类使用参数化运行器运行时,需要在测试类的声明处加上@RunWith(Parameterized.class)注解,表示该测试类将不使用JUnit内建的运行器运行,而使用参数化运行器运行,在参数化运行类中提供参数的方法要使用@Parameters注解,同时在测试类的构造函数中为各个参数赋值(构造方法由JUnit调用),最后编写测试类,它会根据参数的组数来多次运行测试,比如:
注意:参数化测试用于某一测试方法的多组输入,如果一个测试方法,比如add()方法,只需要测试一组输入,那就不必要使用参数化测试
6、在JUnit 4中,如果想要同时运行多个测试,需要使用两个注解:@RunWith(Suite.class)和@Suite.SuiteClasses(Class>[]),通过这两个注解分别指定使用Suite运行器来运行测试用例和指定运行哪些测试类,其中@SuiteClasses中可以继续指定Suite,这样JUnit会再去寻找里面的测试类,一直到能够执行的test case,并执行,比如:
注意:套件测试只有自动化执行所有的测试用,需要先写好各种测试类
JUnit 3.8 API
Class TestCase(继承Assert,实现Test接口):
一个测试类继承自TestCase,定义了桩(fixture)来执行多个测试用例,通过setUp方法初始化fixture,通过tearDown清除
构造方法:
public TestCase():不推荐使用,除非配合setName()方法
public TestCase(java.lang.String name):构造名为name的测试用例,比如:
new CalculatorTest(“testAdd”);
成员方法:
protected void setUp():初始化fixture,在测试方法运行前,setUp首先运行
protected void tearDown():清除fixture,在测试方法运行结束后,tearDown再运行
因此,每一个Test Case的执行顺序为:setUp,testXxx,tearDown
public void setName(java.lang.String name):确定测试用例的名字
源代码分析:
Class Assert(superclass of TestCase 和 TestDecorator):
Assert里定义了一系列的assert method,而且都是static void方法,直接由类名调用,只有当assert fails时,打印信息
public static void assertEquals:判断期望值和真实值是否相同
public static void assertNotNull:判断对象不为空
public static void assertFalse:判断条件为false
public static void assertNotSame:判断两个对象是否相同
public static void assertNull:判断对象为空
public static void assertSame:判断两个对象相同
public static void assertTrue:判断条件为true
public static void fail:如果执行了fail方法,那么测试失败了,Assert.fail应当在Test Case期望不能达到的地方,因此,一旦达到了,说明本次测试失败了
Class TestSuit(测试套件,实现了Test接口):自动化执行测试用例
测试套件是测试用例的集合,自动化执行集合中所有用例
构造方法:
TestSuite():构造空测试套件
TestSuite(java.lang.Class theClass):将一个测试类加入测试套件,比如:
TestSuite suite = new TestSuite(MathTest.class)
TestSuite(java.lang.Class[] classes):将多个测试类加入测试套件,比如:
Class[] testClasses = {MathTest.class,AnotherTest.class };
TestSuite suite = new TestSuite(testClasses);
成员方法:
addTest(Test test):向测试套件增加一个测试用例(测试类中的一个测试方法),比如:
记住:增加一个测试用例,而不是测试类整体,因为一个测试类中有多个测试方法(用例)
addTest(new MathTest(“testAdd”));
不是:addTest(new MathTest());
addTestSuite(java.lang.Class testClass):向测试套件增加测试类
Class RepeatedTest(继承TestDecorator,实现Test接口):
一个能多次重复运行测试的装饰器
构造方法:
RepeatedTest(Test test,int repeat):对Test test进行装饰,增强功能
记住一定是对测试方法,而不是测试类进行装饰:
JUnit 4.4 API
Annotation Type Test:
@Test注解告诉JUnit该public void方法是能被运行的测试用例,@Test注解带有两个可选参数,expected(Class Extends Throwable):声明测试方法应该要抛出异常,如果抛出了声明的异常,测试成功,如果测试方法没有抛出异常,或者抛出的异常不是声明的,那么测试失败,比如:
expected参数的作用就好比JUnit 3.8中的的代码:
(从上面可以看出,JUnit 4简化了测试代码的书写)
另一个可选参数是timeout(long),当测试用例的执行时间超过指定的时间时,测试失败
Annotation Type Ignore:忽略测试类或者测试方法
当@Ignore注解修饰测试类时,表示忽略测试类中的所有测试方法;当修饰测试方法时,表示忽略该测试方法,可选参数String value,表示被忽略的原因
org.junit.runners.Suite:
Suite运行器,用来执行测试用的集合,相当于JUnit 3.8中的public static Test suite(),为了使用Suite运行器,需要由@RunWith(Suite.class)和@Suite.SuiteClasses ({TestClass1.class,…})
org.junit.runners.Parameterized(继承Suite):
参数化运行器,实现了参数化测试功能
Unit Testing
单元测试基础
1、Java单元测试框架:JUnit(Eclipse默认安装)、TestNG
2、单元测试目的:判断程序的执行结果与自己的期望结果是否一致
3、口号:keep the bar green,keep the code clean
4、单元测试的任务:
1)接口功能测试:保证接口功能的正确性
2)边界条件测试:当变量是数值,测试主要边界:最大值、最小值、无穷大,测试溢出边界:最大值+1,最小值-1,测试临近边界:最大值-1,最小值+1;当变量是字符串,测试空字符串,对字符串长度应用“数值变量”的边界;当变量是集合,测试空集合,对集合大小应用“数值变量”的边界
3)代码覆盖率测试:语句覆盖、分支覆盖、条件覆盖、路径覆盖等
Java代码覆盖率分析工具:Cobertura,Emma:Eclipse插件Eclemma,Jacoco
5、圈复杂度(Cyclomatic Complexity):衡量一个模块判定结构的复杂程度,圈复杂度大说明程序代码的判断逻辑复杂,难以测试和维护,计算方法:V(G)=e-n+2,其中e表示控制流图中的边的数量,n表示控制流图中节点的数量。圈复杂度的直观计算:V(G)=判定节点数(P)+1 = 区域数,比如下面的代码,圈复杂度为2
Java圈复杂度分析工具:Eclipse插件Metrics
JUnit 3.8
1、JUnit的最佳实践经验:
1)新建名为test的source folder,用于存放测试源代码
src和test分别是两个source folder,程序发布的时候略去test文件夹,但是目标类和测试类生成的.class文件能都在bin目录
2)虽然被测源代码和测试源代码在不同的source folder,但是应在source folder里面建立同名的包,这样测试源代码能够访问源代码里pulic,protected和default的类文件
3)测试类的命名规则:XxxxTest或者TestXxxx
2、在JUnit 3.8中,需要满足:
1)测试类,如XxxxTest必须继承TestCase(TestCase继承Assert)
2)测试方法(测试用例)的4大特点:public、void、无参数 、方法名称以test开头
(其实在文档中给出了说明,更深一步的理解是通过查看源代码)
比如,对待测方法divide():
我们可以设计多个测试用例,如测试正常情况和除数为0的情况:
测试正常的情况:
测试除数为0的情况:
3、测试用例(Test Case)的设计是单元测试的一个重要方面
1)Test Case 之间一定要保持完全的独立性,互补干扰
2)每个Test Case 只完成一项测试任务,测试通过的标准就是完成任务
4、Eclipse集成的测试工具:
测试成功:
测试失败:
5、Eclipse能直接新建JUnit Test Case
6、JUnit本身自带的测试方式:
1)junit.textui.TestRunner.run(CalculatorTest.class);
测试成功:
2)junit.awtui.TestRunner.run(CalculatorTest.class);
测试成功:
7、当被测试的方法是private方法:
答:利用反射(reflection)机制,记住:No reflection,no more framework,比如:
待测试方法:
测试用例:
8、TestSuit:自动执行测试套件里面所有的测试用例
10、在codes文件夹里给出了具体的测试练习
11、JUnit中的失败(failure)和错误(error),error指的是代码中抛出了异常等影响代码正常执行的情况,比如抛出了ArrayOutOfBoundsException,failure指的是assert所期待的结构与程序实际执行的结果不一致,或者直接调用了fail()方法
12、对测试类来说,如果一个测试类中有5个测试方法,那么JUnit就会创建5个测试类的对象,每一个对象只会调用一个测试方法,并且执行测试方法之前,需要先判断测试方法是否是public void no-arg no-return
JUnit 4.4
1、JUnit 4全面引入Annotation来执行编写的测试用例,体会到Annotation的重要性
2、JUnit 4 不要求测试类继承TestCase,测试方法名无需以test开头(最好以test开头),但是需要通过Annotation机制(Annotation Type Test)标识这是一个测试用例,所有被@Test注解所修饰的public void方法都是test case,可被JUnit所执行,比如:
3、JUnit 3.8中的setUp和tearDown,在JUnit 4.4中由Annotation Type Before和Annotation Type After所取代,比如:
4、JUnit 4有全局初始化(@BeforeClass)和全局销毁方法(@AfterClass)修饰public static void no-arg的方法,被@BeforeClass注解所修饰的方法会在所有测试方法执行前执行1次,被@AfterClass注解所修饰的方法会在所有测试方法执行后执行1次,通常这两个注解用于昂贵的资源,比如:数据库连接
5、参数化测试(Parameters):当一个测试类使用参数化运行器运行时,需要在测试类的声明处加上@RunWith(Parameterized.class)注解,表示该测试类将不使用JUnit内建的运行器运行,而使用参数化运行器运行,在参数化运行类中提供参数的方法要使用@Parameters注解,同时在测试类的构造函数中为各个参数赋值(构造方法由JUnit调用),最后编写测试类,它会根据参数的组数来多次运行测试,比如:
注意:参数化测试用于某一测试方法的多组输入,如果一个测试方法,比如add()方法,只需要测试一组输入,那就不必要使用参数化测试
6、在JUnit 4中,如果想要同时运行多个测试,需要使用两个注解:@RunWith(Suite.class)和@Suite.SuiteClasses(Class>[]),通过这两个注解分别指定使用Suite运行器来运行测试用例和指定运行哪些测试类,其中@SuiteClasses中可以继续指定Suite,这样JUnit会再去寻找里面的测试类,一直到能够执行的test case,并执行,比如:
注意:套件测试只有自动化执行所有的测试用,需要先写好各种测试类
JUnit 3.8 API
Class TestCase(继承Assert,实现Test接口):
一个测试类继承自TestCase,定义了桩(fixture)来执行多个测试用例,通过setUp方法初始化fixture,通过tearDown清除
构造方法:
public TestCase():不推荐使用,除非配合setName()方法
public TestCase(java.lang.String name):构造名为name的测试用例,比如:
new CalculatorTest(“testAdd”);
成员方法:
protected void setUp():初始化fixture,在测试方法运行前,setUp首先运行
protected void tearDown():清除fixture,在测试方法运行结束后,tearDown再运行
因此,每一个Test Case的执行顺序为:setUp,testXxx,tearDown
public void setName(java.lang.String name):确定测试用例的名字
源代码分析:
Class Assert(superclass of TestCase 和 TestDecorator):
Assert里定义了一系列的assert method,而且都是static void方法,直接由类名调用,只有当assert fails时,打印信息
public static void assertEquals:判断期望值和真实值是否相同
public static void assertNotNull:判断对象不为空
public static void assertFalse:判断条件为false
public static void assertNotSame:判断两个对象是否相同
public static void assertNull:判断对象为空
public static void assertSame:判断两个对象相同
public static void assertTrue:判断条件为true
public static void fail:如果执行了fail方法,那么测试失败了,Assert.fail应当在Test Case期望不能达到的地方,因此,一旦达到了,说明本次测试失败了
Class TestSuit(测试套件,实现了Test接口):自动化执行测试用例
测试套件是测试用例的集合,自动化执行集合中所有用例
构造方法:
TestSuite():构造空测试套件
TestSuite(java.lang.Class theClass):将一个测试类加入测试套件,比如:
TestSuite suite = new TestSuite(MathTest.class)
TestSuite(java.lang.Class[] classes):将多个测试类加入测试套件,比如:
Class[] testClasses = {MathTest.class,AnotherTest.class };
TestSuite suite = new TestSuite(testClasses);
成员方法:
addTest(Test test):向测试套件增加一个测试用例(测试类中的一个测试方法),比如:
记住:增加一个测试用例,而不是测试类整体,因为一个测试类中有多个测试方法(用例)
addTest(new MathTest(“testAdd”));
不是:addTest(new MathTest());
addTestSuite(java.lang.Class testClass):向测试套件增加测试类
Class RepeatedTest(继承TestDecorator,实现Test接口):
一个能多次重复运行测试的装饰器
构造方法:
RepeatedTest(Test test,int repeat):对Test test进行装饰,增强功能
记住一定是对测试方法,而不是测试类进行装饰:
JUnit 4.4 API
Annotation Type Test:
@Test注解告诉JUnit该public void方法是能被运行的测试用例,@Test注解带有两个可选参数,expected(Class Extends Throwable):声明测试方法应该要抛出异常,如果抛出了声明的异常,测试成功,如果测试方法没有抛出异常,或者抛出的异常不是声明的,那么测试失败,比如:
expected参数的作用就好比JUnit 3.8中的的代码:
(从上面可以看出,JUnit 4简化了测试代码的书写)
另一个可选参数是timeout(long),当测试用例的执行时间超过指定的时间时,测试失败
Annotation Type Ignore:忽略测试类或者测试方法
当@Ignore注解修饰测试类时,表示忽略测试类中的所有测试方法;当修饰测试方法时,表示忽略该测试方法,可选参数String value,表示被忽略的原因
org.junit.runners.Suite:
Suite运行器,用来执行测试用的集合,相当于JUnit 3.8中的public static Test suite(),为了使用Suite运行器,需要由@RunWith(Suite.class)和@Suite.SuiteClasses ({TestClass1.class,…})
org.junit.runners.Parameterized(继承Suite):
参数化运行器,实现了参数化测试功能