单元测试概述
什么是单元测试(白盒测试)?
单元测试是开发者编写的一小段代码,用于检验被测代的一个很小的、很明确的功能是否正确.。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
单元测试什么时候开始?
越早介入越好
单元测试由谁负责?
由开发负责
单元测试需要注意
单元测试的时候一个大前提就是需要清楚的知道,自己要测试的程序块所预期的输入和输出,然后根据这个预期和程序逻辑来书写case。这里的预期结果一定要针对需求/设计的逻辑去写,而不是针对程序的实现去写,否则单测就失去了意义,照着错误的实现设计出的case也很可能是错的。
单元测试框架列举及国内大厂现状
Unittest
Python内置的标准类库。它的API跟Java的JUnit、.net的NUnit,C++的CppUnit很相似
Pytest
丰富、灵活的测试框架,语法简单,可以结合allure生成一个炫酷的测试报告,现在比较主流
Nose
Nose是对unittest的扩展,使得python的测试更加简单
Mock
unittest.mock是用来测试python的库。这个是一个标准库(出现在python3.3版本以后)
单元测试覆盖率
代码覆盖率也被用于自动化测试和手工测试来度量测试是否全面的指标之一,应用覆盖率的思想增强测试用例的设计
单元测试覆盖类型:
语句覆盖
条件覆盖
判断覆盖
路径覆盖
被测试代码片段
def demo_method(a,b,x):
if (a>1 and b == 0):
x = x/a
if (a == 2 or x>1):
x = x+1
return x
语句覆盖
语句覆盖定义
通过设计一定量的测试用例,保证被测试的方法每一行代码都会被执行一遍
运行测试用例的时候被击中的代码行即称为被覆盖的语句
测试用例
仅需要一条case,即可实现行覆盖
a =3, b=0, x=4
漏洞
and -> or
行覆盖是一个最基础的覆盖方式,但是也是最薄弱的,如果完全依赖行覆盖,会出现很严重的问题
判断覆盖
判断覆盖定义
运行测试用例的过程中被击中的判定语句
测试用例
漏洞
大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径
a2 or x>1 -> a2 or x<1
条件覆盖
条件覆盖定义
条件覆盖和判定覆盖类似,不过判定覆盖关注整个判定语句,而条件覆盖则关注某个判断条件
测试用例:if(a>1 and b ==0)
缺陷
测试用例指数级增加(2**conditions)
路径覆盖
路径覆盖定义
覆盖所有可能执行的路径
测试用例