【软件构造】第七章第五节 测试与测试优先编程

第七章第五节 测试与测试优先编程

  • 确保程序正确性/健壮性的最普遍的手段:测试
    • 设计测试用例
    • 用JUnit写测试程序
    • 自动化测试过程

Outline

  • 测试和测试优先编程
  • 黑盒测试
    • 等价类划分
    • 边界值分析
  • 代码覆盖度
  • 用注释形式撰写测试策略
  • JUnit测试用例写法

 Notes

## 测试和测试优先编程

【测试的定义】

  • 测试:发现程序中的错误 提高程序正确性的信心
  • 程序正确确认的基本方法:
    • 形式化推理
    • 代码评审
    • 测试
  • 测试是提高软件质量的重要手段
    • 确认是否可达到可用的级别
    • 关注系统某一侧面的质量特性
    • 是否满足需求
    • 是否正确响应所有需求
    • 性能是否可接受
    • 是否可用
    • 可否正确部署安装
    • 是否达到期望

 【测试的分类】

  • 单元测试
  • 集成测试
  • 系统测试
  • 回归测试
  • 验收测试

## 黑盒测试

  • 白盒测试:对程序内部代码结构的测试 只关注代码内部的问题
  • 黑盒测试:对程序外部表现出来的行为的测试 采用两个方法
    • 等价划分  将程序可能的输入进行分类 划分为不同集合 包括不合法数据
      • 等价类划分可有两种不同的情况:有效等价类和无效等价类。
      • 若一组对象自反、对称、传递,则为等价类
      • 可产生相似结果的输入集合中的一个可代替整个集合
      • 同理,对输出也可以划分等价类
      • 极端:每个分区只有一个测试用例,覆盖所有分区
    • 边界值分析方法   边界值分析法是对输入输出的边界值进行测试一种黑盒测试方法,是对等价类分析法的补充。
      • 错误通常隐藏在边界中,如一位偏移、边界值需单独处理等
      • 找到有效数据和无效数据的分界点(最大值、最小值),对该分界点以及两边的值分别单独进行测试。
      • 等价类划分法可以挑选等价类范围内任意一个数据作为代表,而边界值分析法要求每个边界值都要作为测试条件。
  • 测试困难
    • 软件行为在离散输入空间中差异巨大 
      • 大多数正确 少数错误
      • bug出现不遵循特定概率分布
    • 无统计规律可循

## 代码覆盖度

  • 定义:已有的测试用例有多大程度覆盖了被测程序;
  • 代码覆盖度越低,测试越不充分;但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高;
  • 代码覆盖率高的程序在测试期间执行了更多的源代码,与低代码覆盖率的程序相比,包含未检测到的软件错误的可能性较低
  • 基本覆盖标准:函数覆盖;语句覆盖、分支覆盖、
  • 条件覆盖、
  • 路径覆盖
  • 测试效果:路径 > 分支 > 语句
  • 测试难度:路径 > 分支 > 语句

部分转自  长安蒹葭的博客

##  以注释的形式撰写测试策略

  • “测试策略”通俗来讲就是6个字:“测什么”和“怎么测”。测试策略非常重要,需要在程序中显性记录下来。
  • 目的:在代码评审过程中,其他人能够理解你的测试,并评判测试是否充分
  • 在测试类的顶端写策略

   

  • 在每个测试方法前说明测试用例是如何选择的

   

## JUnit 测试用例写法

  • Junit单元测试是依据 注释中@Test 之前的方法编写的
  • JUnit测试经常调用多次方法,使用 assertEqual || assertTrue || assertFalse 来检查结果
  • @Before:准备测试、完成初始化,每个测试方法前执行一次
  • @After:清理现场,每个测试方法后执行一次
  • @Test:表明测试方法,内含Assert语句
    • 第一个参数是预期结果、第二个参数实施及结果;
    • 如果断言失败,该测试方法直接返回,Junit记录该测试的失败;
    • 一个测试方法失败,其他测试方法仍运行
    • @Test(expected = *.class):对错误的测试,expected的属性值是一个异常
    • @Test(timeout = xxx):测试方法在制定的时间之内没有运行完则失败
  • @ignore:忽略测试方法
  • 栗子:
 1 public class Calculator {
 2     public int evaluate(String expression) {
 3         int sum = 0;
 4         for (String summand: expression.split("\\+"))
 5             sum += Integer.valueOf(summand);
 6         return sum;
 7     }
 8 }
 9 ---------------------------------------
10 import static org.junit.Assert.assertEquals;
11 import org.junit.Test;
12 
13 public class CalculatorTest {
14 @Test
15 public void evaluatesExpression() {
16         Calculator calculator = new Calculator();
17         int sum = calculator.evaluate("1+2+3");
18         assertEquals(6, sum);
19     }
20 }    

  

 

posted @ 2018-06-19 01:07  HongmingYou  阅读(407)  评论(0编辑  收藏  举报