unittest测试框架详解
2020-03-16 10:04
197 查看
# 单元测试的定义
## 1. 什么是单元测试?
单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的,按照测试阶段来分,就是单元测试、集成测试、系统测试以及验收测试。
## 2.为什么要做单元测试?
+ 📕 单元测试之后,才是集成测试,单个单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试,为了从底层发现bug,单元测试时可以减少合成后出现的问题。
+ 📒 越早发现bug越好,这样可以早点发现问题,不然问题累计到后面,很可能会因为一个做错了而导致整个模块甚至更大范围的推倒重来,对于时间和经费来说,是非常浪费的!
+ 📘 对于测试来说,单元测试就是为了执行用例,输入测试数据--》输出测试结果
# unittest框架及原理
做过自动化测试的同学应该都知道python中的unittest框架,它是python自带的一套测试框架,学习起来也相对较容易,unittest框架最核心的四个概念:
🍊 test case:就是我们的测试用例,unittest中提供了一个基本类TestCase,可以用来创建新的测试用例,一个TestCase的实例就是一个测试用例;unittest中测试用例方法都是以test开头的,且执行顺序会按照方法名的ASCII值排序。
🍅 test fixure:测试夹具,用于测试用例环境的搭建和销毁。即用例测试前准备环境的搭建(SetUp前置条件),测试后环境的还原(TearDown后置条件),比如测试前需要登录获取token等就是测试用例需要的环境,运行完后执行下一个用例前需要还原环境,以免影响下一条用例的测试结果。
🍋 test suite:测试套件,用来把需要一起执行的测试用例集中放到一块执行,相当于一个篮子。我们可以使用TestLoader来加载测试用例到测试套件中。
🍇 test runner:用来执行测试用例的,并返回测试用例的执行结果。它还可以用图形或者文本接口,把返回的测试结果更形象的展现出来,如:HTMLTestRunner。
# unittest的断言
在python基础中,我们有讲过一个assert断言,使用方法比较简单,即`assert 表达式, 提示信息`,而unittest框架中也提供了一个自带的断言方式,主要有以下几种:
| **方法** | **检查** |
| -------------------------- | ------------------- |
| assertEqual(a, b,msg=None) | a ==b |
| assertNotEqual(a, b) | a !=b |
| assertTrue(x) | bool(x) is True |
| assertFalse(x) | Bool(x) is False |
| assertIs(a, b) | a is b |
| assertIsNot(a, b) | a is not b |
| assertIsNone(x) | x is None |
| assertIsNotNone(x) | x is not None |
| assertIn(a, b) | a in b |
| assertNotIn(a, b) | a not in b |
| assertIsInstance(a, b) | isinstance(a,b) |
| assertNotIsInstance(a, b) | not isinstance(a,b) |
如果断言失败即不通过就会抛出一个`AssertionError`断言错误,成功则标识为通过,以上几种方式都有一个共同点,就是都有一个msg参数(表中只列了一个,其实都有),默认是None,即`msg = None`,如果指定msg参数的值,则将该信息作为失败的错误信息返回。
# TestCase测试用例
编写测试用例前,我们需要建一个测试类继承unittest里面的TestCase类,继承这个类之后我们才是真正的使用unittest框架去写测试用例,编写测试用例的步骤如下:
+ 导入unittest模块
+ 创建一个测试类,并继承`unittest.TestCase()`
+ 定义测试方法,方法名必须以test_开头
+ 调用`unittest.main()`方法来运行测试用例,unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行
下面以注册功能为例,这个register.py就是注册功能的代码,没有前端界面,功能比较简单,只是方便用于演示,直接导入就可以使用。
```python
# register.py
users = [{'username': 'test', 'password': '123456'}]
def register(username, password1, password2):
if not all([username, password1, password2]):
return {"code": 0, "msg": "所有参数不能为空"}
# 注册功能
for user in users:
if username == user['username']:
return {"code": 0, "msg": "该用户名已存在!"}
else:
if password1 != password2:
return {"code": 0, "msg": "两次密码输入不一致!"}
else:
if 6 = 6 and 6
相关文章推荐
- Python unittest测试框架详解
- Python Unittest自动化单元测试框架详解
- selenium一个完整的unittest测试框架格式(单线程,非测试报告)
- Python接口测试之unittest框架(五)
- UnitTest测试框架应用
- Python unittest 测试框架学习笔记
- Python+requests+unittest+excel实现接口自动化测试框架
- Python Unittest - 根据不同测试环境跳过用例详解
- unittest框架学习,一步步生成html格式测试报告
- Unit Test测试框架中的测试的执行顺序
- python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)
- unittest测试框架的四个重要概念
- selenium一个完整的unittest测试框架格式(单线程,非测试报告)
- python unittest测试框架介绍
- python+requests+unittest API接口测试实例(详解)
- Python之使用unittest框架和HTMLTestRunner.py文件实现多个测试用例执行与测试报告生成
- 基于unittest测试框架的扩展
- unittest框架测试项目讲解
- python测试框架——unittest和nosetest
- python测试框架——unittest和nosetest