Python Unittest 这篇文章将不断的持续更新和重构
文章目录
1. 单元测试概述
2. 单元测试框架列举
3. 单元测试覆盖率
3.1 语句覆盖
3.2 判断覆盖
3.3 条件覆盖
3.4 路径覆盖
2 unittest编写与规范
1. 单元测试概述
。什么是单元测试?
。单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很
明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件
(或者场景)下某个特定函数的行为。
。单元测试什么时候测试?
。单元测试由谁负责?
单元测试需要注意
。单元测试的时候一个大前提就是需要清楚的知道,自己要测试的程序块所预期
的输入和输出,然后根据这个预期和程序逻辑来书写case。这里的预期结果一
定要针对需求/设计的逻辑去写,而不是针对程序的实现去写,否则单测就失
去了意义,照着错误的实现设计出的case也很可能是错的。
2. 单元测试框架列举
Unittest
Python内置的标准类库。它的API跟Java的JUnit、.net的NUnit, C++CppUnit很相似
Pytest
丰富、灵活的测试框架,语法简单,可以结合allure生成一个炫酷的测试报告,现在比较主流
Nose
Nose是对unittest的扩展,使得python的测试更加简单。
Mock
unittest.mock是 用来测试python的库。这个是一一个标准库(出现python3.3版本以后)
3. 单元测试覆盖率
代码覆盖率也被用于自动化测试和手工测试来度量测试是否全面的指标之一,
应用覆盖率的思想增强测试用例的设计
单元测试覆盖类型:
。语句覆盖
。条件覆盖
。判断覆盖
。路径覆盖
伪代码: def demo_ method(a, b, x): if (a > 1 andb= == 0): X = X / a if (a == 2 orx > 1): X = X + 1 return X
3.1 语句覆盖
语句覆盖 1.语句覆盖定义 通过设计一定量的测试用例,保证被测试的方法每一行代码都会被执行一遍. 运行测试用例的时候被击中的代码行即称为被覆盖的语句 2.测试用例 仅需要一条case,即可实现行覆盖 3.漏洞 and-> or 行覆盖是一个最基础的覆盖方式,但是也是最薄弱的,如果完全依赖行覆盖,会出现很严重的问题
3.2 判断覆盖
判断覆盖 1.判断覆盖定义 运行测试用例的过程被击中的判定语句 2.测试用例
3.漏洞 大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径 a==2 Orx>1 ->a==2 or x<1
3.3 条件覆盖
条件覆盖 1.条件覆盖定义 条件覆盖和判定覆盖类似,不过判定覆盖关注整个判定语句,而条件覆盖则关注某个判断条件 2.测试用例:if(a>1 and b==0)
3.缺陷 测试用例指数级增加(2**conditions)
3.4 路径覆盖
1.路径覆盖定义 覆盖所有可能执行的路径 2.测试用例
应用这些方法设计测试用例
2 unittest编写与规范
unitest官网
unittest编写与规范
Unittest提供了了test cases、 test suites、 test fixtures、 test runner相关的组件
编写规范:
测试模块首先import unittest
测试类必须继承unittest.TestCase
测试方法必须以"test_”开头
import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main()
待补充代码
总结: 1.setUp用来为测试准备环境,tearDown用 来清理环境。 2.如果想要在所有case执行之前准备一次环境,并在所有case执行结束之后再清理环境,我们可以用setUpClass()与tearDownClass();比如:数据库连接及销毁 3.如果想有些方法不在本次执行使用@unittest.skip 4.测试方法的命名:以test开头 5.各种执行-单一用例,全部