`

测试基础知识和Eclemma使用总结

阅读更多
测试基础知识和Eclemma使用总结
1.1 概念
对软件基本组成单元进行的测试,单元具有明确的功能,与其它单元有明确的接口,不一定是一个具体的方法。但是,一般情况下,一个单元测试是用于判断某个特定条件(或者场景)下某个特定方法的行为。
1.2 特点
 属于白盒测试,依据单元的具体实现、代码逻辑结构、数据流向来设计测试用例。
1.3 单元测试覆盖率
单元测试是白盒测试,所以判断覆盖率的依据是逻辑覆盖,就是语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、路径覆盖。
2 Junit测试框架
2.1 JUnit简介
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),用于帮助Java开发人员编写单元测试。
2.1.1 Junit的核心类和接口
1. Test接口,框架的主接口,有两个方法:
public int countTestCases() 返回所有测试用例的个数。
public void run(TestResult arg0) 运行一个测试,并且收集运行结果到TestResult。
2. TestCase类,实现了Test接口,我们所有的测试方法都要在这个类的子类中定义。
3. TestSuite类,实现了Test接口,一个TestSuite可以包含一系列的TestCase。把testCase组装入TestSuite有几种方式:
 通过将TestCase的Class参数传入TestSuite的构造函数,TestSuite会自动收集TestCase中所有的public的没有参数的testxxx方法加入TestSuite中。
 构造空的TestSuite后通过void addTest(Test test)方法添加测试。
 构造空的TestSuite后通过void addTestSuite(Class testClass) 方法添加测试集。
 附加说明:TestCase和TestSuite的设计采用了Composite模式。这样JUnit可以一次运行一个测试用例,也可以一次运行多个测试用例。使用接口是一致的,TestRunner只关心Test接口,而对运行的是单个的TestCase还是同时运行多个TestCase并不在意。
4. TestResult类,通过run方法收集测试结果。
5. TestRunner类,启动测试的主类,我们可以通过直接调用它运行测试用例,IDE和其他一些工具一般也通过这个接口集成JUnit。
6. Assert类,TestCase继承自该类,我们的测试方法通过这些断言判断程序功能是否通过测试。
7. TestListener接口
2.1.2 常用方法介绍
断言方法:
 assertEquals(expect,actual)参数是期望值和真实值,assertEquals有多个重载方法,只要参数类型必须相同。
 assertSame(期望对象,实际对象),检查具有相同内存地址的两个对象是否相等,利用内存地址进行判断。
 assertTrue(布尔条件)和assertFalse(),检查布尔条件是否为真。
 assertNull(对象1,对象2)和assertNotNull(),检查一个对象是否为空。
2.2 使用规则
1. 类名规则:需测试的类名+Test,例如ConfigManagerTest类用于测试ConfigManager类的方法。
2. 方法规则:test+方法名字,例如testGetDetailInfo()。
3. 必须继承TestCase类。
4. setUp方法和tearDown方法:setUp方法在每个测试方法调用前调用,负责初始化测试方法所需要的测试环境;tearDown在每个测试方法被调用之后被调用,负责撤销测试环境。即如果有10个测试方法,则setup和tearDown分别会调用10次。
2.3 使用步骤
2.3.1 写测试用例步骤原则
1. 编写测试用例类,使其继承TestCase类。
2. 编写测试方法,并用test+方法名命名。方法内的逻辑如下:
1) 获取准备的测试数据。
2) 调用被测试对象的方法。
3) 编写断言,验证结果。
3. 如果测试方法有公用的变量等需要初始化和销毁,则可以使用setUp,tearDown方法。例如可以在setUp中获取准备的测试数据,生成相应的测试对象,在tearDown方法中销毁测试对象。
2.3.2 在eclipse中用junit
1. 生成测试类和方法:
Eclipse已经集成了Junit插件,可以省略一些步骤。

经过上面几个步骤,eclipse就可以自动生成测试类和测试方法,然后你需要在测试方法里写出测试逻辑。
2. 运行测试方法:单击右键选择Run As JUnit Test 即可。
3. 查看运行结果,在JUnit窗口中,能够看到每一个测试方法的测试结果: 
 是否成功:红色表示失败,绿色代表成功;
 运行时间:每一个测试方法的后面有一个括号,里面是一个方法的运行时间;在最上面还可看到跑完所有用例总的运行时间
 总的测试方法个数和失败方法个数。
2.4 实战
2.4.1 例1
//继承TestCase,注意类命名规则。
public class UpgradeScriptForGenerateTest extends TestCase
{
// 被测对象
    private UpgradeScriptForGenerate usf;
//初始化被测对象和测试工具类
    protected void setUp() throws Exception
    {
        usf = new UpgradeScriptForGenerate();
    }
//销毁测试数据
    protected void tearDown() throws Exception
    {
        usf = null;
    }
//测试方法,注意命名规则
    public void testRunLuaScript()
    {
//准备测试数据
        FlowResult result;
        DeviceConfigVO vo = new DeviceConfigVO();       vo.setRootDir("D:/Upgradetool/package/upgradetool/data/device/luatest");
        vo.setDeviceInfoFilePath("device.xml");
        String scriptDir = "D://Upgradetool//package//upgradetool//conf//V3R7C00TOV8R3C00//script";
        ……"D:/Upgradetool/package/upgradetool/conf/V5R7C02TOV8R2C01/device");
//调用被测对象的方法
        result = usf.doPerform(vo, null, properConfig);
//写断言,验证测试结果。
        assertEquals(FlowResultEnum.SUCCESS, result.getResult());
        List<String> list = result.getResultList();
        assertTrue(list != null);
    }
}
3 JUnit4
3.1 新特性
1. JUnit大量使用了annotations特性,使编写单元测试变得更加简单。
2. 改变测试方法的命名方式。
3. 不再强制继承TestCase,但需要import org.junit.Assert来实现断言。
4. 改变初始化和销毁方式。
5. 改变异常处理方式。
3.2 在eclipse中的使用步骤
1. 生成测试类和方法:
步骤与上面使用Junit的步骤基本一致:如下




新建Junit Test Case时,选择New JUnit4 test即可。

经过上面几个步骤,eclipse就可以自动生成测试类和测试方法,然后你需要在测试方法里写出测试逻辑。在测试类中,并不是每一个方法都是用于测试的,你必须使用“标注”来明确表明哪些是测试方法。下面说明“标注”意义:
 @Before
表明这是初始化的方法在Test方法调用前调用,方法名不一定是setUp()。
 @After
表明这是注销方法,方法名不一定是tearDown()。
 @BeforeClass
与@BeforeClass类似,不同的是它是类级别的。
 @AfterClass
与@AfterClass类似,不同的是它是类级别的。
类级别与方法级别的不同:
@Before与@After调用时机:

@BeforeClass与@AfterClass调用时机:

 @Test
表明这是一个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。
 @Ignore
这个标注的含义就是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
2. 运行测试方法:单击右键选择Run As JUnit Test 即可。
3. 查看运行结果,在JUnit窗口中,能够看到每一个测试方法的测试结果:
 “绿色背景的对号”代表成功。
 “蓝色背景的差号”代表断言失败。
 “红色背景的差号”代表抛出了异常,即程序出错。

4 测试覆盖率
4.1 测试覆盖率工具
4.1.1 安装eclemma插件步骤
Eclemma压缩包的地址,已上传到SVN上: \VRP工具团队\99 Tools
1. 解压eclemma后会有两个文件夹plugins和features。
2. 将plugins中的内容复制到eclipse的plugins文件夹中,将features中的内容复制到eclipse的features文件夹中。
3. 重启eclipse,会看到界面的左上角多了一个 按钮(下文用Coverage按钮代替),说明安装成功。
4.1.2 配置eclemma步骤
1. 点击coverage按钮,选择Coverage Configurations…。

2. 配置Test:在Coverage Configurations界面,选择Test标签,选择测试用例所在工程,测试类和测试方法。

3. 配置Coverage:点击Test右边的Coverage,勾选覆盖范围。

4. 配置Arguments
5. 配置Classpath
 不需要对于每一个测试类都要经过这么复杂的测试,右击左下角已配置过的测试类,选择Duplicate,就会复制这个测试类的配置。

4.1.3 查看测试结果
1. 运行测试用例,方法有三种:①在Coverage Configurations界面,双击左侧的测试配置名字。②选中测试类,然后单击Coverage按钮,选择Coverage As,JUnit Test。③点击Coverage视图的第一个按钮 。

2. 查看结果:在代码编辑器中,可以看覆盖范围内的代码用不同颜色标识。
 绿色表示该代码完全执行过。
 红色表示代码根本没有执行过。
 黄色表示代码被部分执行,黄色通常出现在一行中出现分支的语句。

3. 在下方的Coverage窗口,能够看到每一个方法的代码的覆盖率。

4.1.4 综合多次覆盖数据
想在一次运行中覆盖所有的代码通常比较困难,如果能把多次测试的覆盖数据综合起来进行察看,那么我们就能更方便的掌握多次测试的测试效果。EclEmma 提供了这样的功能。Coverage 视图总是显示最新完成的一次覆盖测试。事实上,EclEmma 为我们保存了所有的测试结果。
配置步骤:
1. 点击Coverage视图右上角的第四个按钮。
2. 选择merge的测试历史。在合并完成之后,我们可以观察到 Java 编辑器和 Coverage 视图中都显示了合并之后的结果。

5 怎样写单元测试逻辑?
5.1 依据的原则
逻辑覆盖,就是语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、路径覆盖。
5.2 实战
5.2.1 被测类
public class Coverage
{
    public int count( int a, int b, int x)
    {
        if (a > 1 && b == 0)
        {
            x = x / a;
        }
        if (a == 2 || x > 1)
        {
            x = x + 1;
        }
        return x;
    }
}
5.2.2 测试类
public class CoverageTest
{
    private Coverage coverage;
    @Before
    public void setUp() throws Exception
    {
        coverage=new Coverage();
    }
    @After
    public void tearDown() throws Exception
    {
        coverage=null;
    }
    @Test
    public void testCount()
    {
        int result=coverage.count(2, 0, 3);
        assertEquals(2, result);
    }
}
5.2.3 测试数据
程序的流程图:

1. 为满足覆盖率而设计测试用例
1. 语句覆盖:
 a=2,b=0,x=3,用覆盖率测试工具测试结果如下

可以看到第二个if语句是部分执行,因为在“或”的条件中,判断第一个条件符合后,将不再判断第二个条件,所以“x>1”并没有执行。
作用:能够检查出不可达的语句,但是不能检查出逻辑错误。
 a=3,b=0,x=3。这样每一个判断语句都得到了执行,覆盖率达到了100%。做到了语句覆盖。
2. 判定覆盖
每个判断的取真分支和取假分支各执行一遍,又叫分支覆盖。上面的一组测试数据做到了语句覆盖,覆盖了abe流程。如果要做到分支覆盖,就要bcde都要走一遍。
作用:判定覆盖比语句覆盖强一点,但是仍然不一定能检查出判定内部条件的错误。
 a=1,b=0,x=1。这个测试语句会走流程acd。这样通过两组数据后,每个分支都走了一遍。做到了判定覆盖就做到了语句覆盖。
3. 条件覆盖
判定条件的每个条件分别取真和取假一次,一般需要设计比满足判定覆盖更多的测试用例。
作用:能更强地检查处判定条件是否写错上,但是不能保证满足判定覆盖。
下表是本例中四个条件的八种情况:
a>1 b=0
a<1 b!=0
a=2 x>1
a!=2 x<=1

 数据a=2,b=2,x=2执行abd路径,满足上表中的绿色背景条件;数据a=1,b=0,x=1执行acd路径,满足上表中的蓝色背景条件。这两组数据做到了条件覆盖,但是不满足判定覆盖和语句覆盖。
4. 判定条件覆盖
设计足够的设计用例,同时满足判定覆盖和条件覆盖。
a>1 b=0
a<1 b!=0
a=2 x>1
a!=2 x<=1
 a=2,b=0,x=2满足绿色背景条件,所走路径是abe;a=1,b=2,x=1满足蓝色背景条件,所走路径是acd。既满足了条件覆盖,又满足了判定覆盖。
5. 路径覆盖
设计足够多测试用例,覆盖程序每条路径。一个程序的if语句个数是n,那么路径个数是2的n次方。
6 黑盒测试
6.1 等价类划分法
等价类可以分为两种情况:
有效等价类:合理的,有意义的输入数据构成的集合。
无效等价类:相反。
作用:能够测试程序的健壮性,测试程序是否考虑了异常情况。
6.1.1 实例
输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … 。
6.1.2 分析与设计
输入条件 无效等价类
整数 一边非整数
两边非整数
三边非整数
正数 一边非正数
两边非正数
三边非正数
三个数 只给一个数
只给两个数
给出四个数
非零 一边为零
两边为零
三边为零
两边之和大于第三边 两边之和小于第三边
两边相等
三边相等
以上只是给出了大致的无效等价类,实际还要细分。例如一边非整数,还要再分哪一边是非整数的,有三种情况。给每一种情况一个标号,一个一个测试。
6.2 边界值分析法
选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据。
作用:长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。
原则:
1. 如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
2. 如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
3. 将规则1)和2)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。
4. 如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
5. 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
6. 分析规格说明,找出其它可能的边界条件。
6.2.1 实例
某程序的规格说明要求计算出“每月保险金扣除额为0至1165.25元”。
6.2.2 分析与设计
0 -0.01 0.01
1165.25 1165.24 1165.26
分享到:
评论

相关推荐

    测试覆盖率工具EclEmma使用培训

    测试覆盖率工具EclEmma使用培训

    使用 EclEmma 进行覆盖测试

    在对一个软件产品进行了单元测试、集成测试、系统测试和验收测试等测试之后,软件质量是不是就有保证了那?这就需要我们对测试的质量进行分析。如果测试仅仅覆盖了很小一部分代码,那么不管我们写了多少测试用例,...

    测试覆盖率插件的使用eclemma

    这是一个整体介绍eclemma插件的原理以及使用方法的一个课件

    junit单元测试与Eclemma的使用

    Junit单元测试 Eclemma对其进行覆盖率分析 测试用例的设计要分别满足语句覆盖、判定-条件覆盖、条件组合、路径覆盖及基本路径测试等不同的测试标准 合并多次测试覆盖率

    代码覆盖测试-Code_Coverage_Testing_with_EclEmma-使用篇

    代码覆盖测试-Code_Coverage_Testing_with_EclEmma-使用篇

    使用EclEmma进行覆盖测试

    介绍安装EclEmma插件使用EclEmma测试Java程序EclEmma的高级特性结论参考资料覆盖测试是衡量测试质量的一个重要指标。在对一个软件产品进行了单元测试、组装测试、集成测试以及接受测试等繁多的测试之后,我们能不能...

    eclemma-3.0.1覆盖率测试工具

    eclemma-3.0.1覆盖率测试工具!希望这这工具可以帮到你。

    eclemma覆盖率测试配置说明

    web开发,我们常常要进行多层的覆盖率测试,emma技术,能够实现。文档说明了如何配置和使用这项技术。

    eclemma-1.4.3.zip

    软件测试覆盖率软件,eclemma最新版本,为软件测试提供帮助

    eclemma单元测试代码覆盖率工具

    EclEmma是一个开源的软件测试工具,可以在编码过程中查看代码调用情况、也可以检测单覆盖率。

    eclemma-2.3.1.zip

    EclEmma 是一个基于EMMA的...EclEmma是非 侵入式的不需要修改你的项目或执行其它任何安装,它能够在工作平台中启动像运行JUnit测试一样直接对代码覆盖进行分析。覆盖结果将立即被汇总并在 Java源代码编辑器中高亮显示。

    Junit覆盖率工具—eclemma-3.1.1.zip

    Junit覆盖率工具—eclemma-3.1.1,EclEmma是一个开源的软件测试工具,可以在编码过程中查看代码调用情况、也可以检测单覆盖率。 1、EclEmma查看代码调用情况:1) 新建一个项目,然后添加一个类,然后简单书写一些...

    eclemma-2.1.4

    eclemma-2.1.4

    EclEmma-V1.3.2

    EclEmma is a free Java code coverage tool for Eclipse

    EclEmma和JaCoCo简介与使用说明

    EclEmma是一个免费的用来测试Java代码覆盖率的Eclipse插件,可以用EclEmma直接在Eclipse工作区中测试Java程序,分析代码覆盖率,并且在Java编辑器中高亮显示源文件的代码覆盖情况。

    eclemma-2.2.0 java

    EclEmma是一个基于EMMA的...EclEmma是非侵入式的不需要修改你的项目或执行其它任何安装,它能够在工作平台中启动像运行JUnit测试一样直接对代码覆盖进行分析。覆盖结果将立即被汇总并在Java源代码编辑器中高亮显示。

    EclEmma java单元测试覆盖率

    为了了解 EclEmma 是如何获得覆盖测试数据的,需要先对 Emma 有初步的了解。通常代码覆盖测试工具都需要对被执行的代码进行修改。而 Emma 提供了两种方式来完成这件事。

Global site tag (gtag.js) - Google Analytics