`

测试基础知识和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 java单元测试覆盖率

    #### 四、使用EclEmma测试Java程序 为了演示EclEmma的功能,我们创建了一个名为`test.emma`的Java项目,并在其中编写了一个简单的`HelloWorld`类。通过EclEmma运行`HelloWorld.main()`函数后,EclEmma会在Java编辑器...

    测试覆盖率插件的使用eclemma

    **EclEmma测试覆盖率插件**是用于提升单元测试质量和软件质量的重要工具。它通过集成在Eclipse IDE中,提供了一种便捷的方式来度量和理解代码的测试覆盖率。本课件将详细介绍EclEmma的原理、使用方法以及相关特性。 ...

    eclemma-3.0.1覆盖率测试工具

    **eclemma-3.0.1覆盖率测试工具详解** EclEmma是一款强大的Java代码覆盖率测试工具,集成在...通过合理使用EclEmma 3.0.1,你可以有效地提升测试质量,确保代码的健壮性和稳定性,为你的软件开发工作带来显著的提升。

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

    EclEmma是一款强大的Java单元测试代码覆盖率工具,它为开发者提供了直观的方式来衡量和评估他们的单元测试的质量。在软件开发过程中,单元测试是确保代码正确性和可靠性的关键步骤,而EclEmma则帮助开发者确保测试...

    EclEmma-V1.3.2

    在使用EclEmma时,确保正确安装和配置插件,然后在Eclipse的运行配置中启用覆盖率选项。在运行测试后,EclEmma会自动收集覆盖率数据,并在工作区中显示。开发者可以通过查看覆盖率视图,深入了解项目的测试覆盖率...

    java-eclemma-3.0.1

    Java EclEmma 3.0.1 是一个强大的单元测试覆盖率工具,专...总的来说,EclEmma 3.0.1作为一个强大的工具,帮助开发者遵循最佳实践,确保代码的健壮性和可靠性,通过深入的测试覆盖率分析,提升了软件开发的效率和质量。

    junit单元测试与Eclemma的使用

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

    eclemma-3.1.0

    通过使用EclEmma 3.1.0,开发者能够更好地理解和改善其Java项目中的测试覆盖情况,从而提高软件的可靠性和维护性。如果你正在寻找一种方法来量化和优化你的测试策略,EclEmma是一个值得尝试的强大工具。

    java覆盖率测试工具eclemma

    在实际使用中,EclEmma的集成特性使得在编写和运行测试用例时,开发者可以实时查看覆盖率数据,从而更有效地优化测试策略。通过这种方式,开发者可以快速定位未被充分测试的部分,确保代码质量。 在提供的压缩包...

    eclemma-2.1.4

    Eclemma 是一个流行的Java代码覆盖率工具,主要用于评估和确保单元测试的质量。它的版本号 "2.1.4" 表示这...提供的压缩包文件包含了 Eclemma 的核心库、依赖、配置信息以及插件定义,便于在各种开发环境中使用和集成。

    eclemma覆盖率测试配置说明

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

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

    ### 代码覆盖测试—Code Coverage Testing with EclEmma 使用篇 #### 一、代码覆盖测试简介 代码覆盖测试是一种衡量软件测试完整性的方法,通过它我们可以了解到自动化测试或手动测试是否真正地覆盖到了代码的各个...

    eclemma-1.4.3.zip

    在实际使用中, Eclemma 可以与其他持续集成工具(如Jenkins)结合,实现自动化测试覆盖率报告,这对于大型项目尤其重要,可以有效地监控代码质量并确保每次代码变更都不会引入新的问题。 总之,Eclemma-1.4.3.zip...

    代码覆盖率工具[EclEmma]使用手册.pdf

    ### 代码覆盖率工具EclEmma使用手册知识点梳理 #### 一、引言 代码覆盖率作为衡量测试质量和软件可靠性的重要指标之一,在软件开发生命周期中扮演着至关重要的角色。EclEmma是一款优秀的Eclipse插件,它能够帮助...

Global site tag (gtag.js) - Google Analytics