软件测试与测试优先的编程
1. Software testing
提高软件质量的重要手段
-
软件测试确认软件是否达到可用级别, 关注系统的某一侧面的指令特性。但即便是最好的测试也不能确保程序100%无错误。
-
我们使用残留缺陷率(测试后每1000行代码中的错误)
- 典型工业软件:1-10
- 高质量验证:0.1-1
- 非常好,严格安全性的验证:0.01-0.1 如NASA或者Praxis公司。
-
软件构造的特征
- 与其他软件的活动目标相反,目的是证错与破坏。
- 再好的测试也无法证明系统里没有错误。
-
好的测试的特性
- 能发现错误
- 不冗余
- 最佳特性,最佳方案
- 别太复杂也别太简单
-
测试的层次
- 单元测试:测试函数与一些类
- 集成测试:把来自多个开发者的、多个功能的组件放在一起,形成包或者组件或者子系统,并对其进行测试
- 系统测试:将所有的子系统构建成一个系统,对其进行测试
- 用户也会进行测试,这就是验收测试。
- 当在测试中发现错误,就要进行修改,修改后还要进行测试,这就是回归测试
-
静态测试与动态测试
- 静态测试是指测试中不执行程序,分析代码结构或者由编译器检查语法与数据流分析,如review、walkthrough、inspection
- 动态测试需要把程序运行起来,输入测试用例,通过结果判定是否存在缺陷。动态测试可以在程序开发前期进行,因此需要打桩模块和驱动模块,或者通过调试器。
- 静态测试不执行程序,动态测试执行。
-
测试与调试的区别
- 测试是发现是否存在错误,调试是识别错误根源,消除错误。
- 测试是发现是否存在错误,调试是识别错误根源,消除错误。
-
白盒测试与黑盒测试
- 白盒测试对程序内部代码进行结构测试,与程序代码是一致的。黑盒测试对程序外部表现行为进行测试,无法得知代码。
-
为什么软件测试是困难的
- 不可能用穷举与暴力的方法实现软件测试
- 靠偶然测试没有意义。这种方法不太可能发现错误。
- 基于样本的统计数据对软件测试意义不大,对于某些硬件适合。
- 软件行为在离散输入空间中差异巨大。
- 软件可能大多数情况下正确,少数点出错。
- bug的出现往往不符合特定概率分布。
- 软件没有统计分布规律可循。错误可能突然出现。
-
软件测试的心态
- 学会对自己的代码暴力些, 作为测试人员,应该要学会让代码“尽快出错”
2. test case
- 测试用例:输入+执行条件+期望结果*
在满足条件的情况下,输入测试用例,得到结果后与期望结果进行比对,查看是否满足条件。
- 测试的流程
- Write Test Cases
- Organized Test Cases
- Execute Test Cases
- Get Status and Report
- 好的测试用例的特征
- 最可能发现错误
- 不重复、不冗余
- 最有效
- 既不简单也不复杂
3. 测试优先编程
写代码之前先写测试
- Tips
- 早测试, 多测试
- 不要把测试放在最后,测试会很复杂
- 测试代码比写代码更有成就感
- Process
- 先写specification
- 在写符合spec的测试用例
- 写代码、执行测试、有问题再改、再执行测试用例、直到通过它
写测试用例,就是理解、修正、完善你的spec的设计的过程。
测试规约也有可能是buggy的。
4. Unit Testing单元测试
单元测试针对软件的最小测试单元模型开展测试,隔离各个模块,容易定位错误和调试
5. JUnit自动化测试
JUnit使用时需要加入Classpath。
Junit用@Test标记被测方法。
注意事项
- 变量顺序很重要,第一个变量应该是期望的结果,第二个是实际结果,所有JUnit支持的断言检测都是期望在前,实际在后。
- 如果断言失败,立刻返回,JUnit记录错误。
- 测试类中可以包括任意个测试方法,运行独立。
- 即使一个运行失败,其他的也仍然会运行。
6. Black-box Testing 黑盒测试
6.1 划分
等价类划分
6.2 Include BoundAries in the Partition
7. White-box Testing
分析用到了哪些代码
- 确保程序中每个独立路径都执行一次
- 每个逻辑判断的真值都测试
- 所有循环的边界与内部
- 内部数据结构的可靠性
8. Coverage Testing覆盖测试
较高覆盖度,则会执行较多代码,更有可能发现错误。可用不同的方法衡量覆盖度,比如程序中子程序执行的百分比是多少,或者是被调用程序百分比。
- 函数覆盖,是否程序中每条函数都被覆盖
- 语句覆盖,是否每一条语句的运行都被覆盖
- 分支覆盖,每个分支结构是否都被执行一次
- 条件覆盖,程序中所有逻辑覆盖的地方,真假值都被执行一次
- 路径覆盖,是否程序中所有的路径都被覆盖一次
100%语句覆盖率是理想追求,但是通常很难实现。比如assertion,不应该进行到这里。
100%分支覆盖是理想的目标。
100%路径覆盖是最好的,但是也是最难实现的。
高版本eclipse内置。右键,coverage as、
9. 自动化测试与回归测试
10. 测试策略的文档撰写
课堂笔记