(三十七)Unittest单元测试框架之认识unittest-重要的概念
随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
学习selenium自动化之前,最好先学习HTML、CSS、JavaScript等知识,有助于理解定位及操作元素的原理。关于python和selenium安装请自行搜索别的资料,这里就不多做介绍了,所有例子均使用python3.6+selenium执行的。
#------------------------------------------------我是可耻的分割线-------------------------------------------
重要的概念
在unittest的文档中开篇就介绍了4个重要的概念:test fixture、test case、test suite和test runner,只有理解了这几个概念才能理解单元测试的基本特性。
- Test Case
一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备的环境的搭建(setUp)、实现测试过程的代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例就是一个完整的测试单元通过运行这个测试单元,可以对某一个功能进行验证。
- Test Suite
一个功能的验证往往需要多个测试用例,可以把多个测试用例集合在一起来执行,这就产生了测试套件TestSuite的概念。Test Suite用来组装单个测试用例。可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例。
- Test Runner
测试的执行也是单元测试中非常重要的一个概念,一般单元测试框架中都会提供丰富的执行策略和执行结果。在unittest单元测试框架中,通过TextTestRunner类提供的run()方法来执行test suite/test case。test runner可以使用图形界面、文本界面,或返回一个特殊的值等方式来表示测试执行的结果。
- Test Fixture
对一个测试用例环境的搭建和销毁,就是一个Fixture,通过覆盖TestSuite的setUp()和tearDown()方法来实现。有什么用呢?比如说在这个测试用例需要访问数据库,那么可以在setUp()中通过建立数据库链接来进行初始化,在tearDown()方法清楚数据库产生的数据,然后关闭链接等。
注意:tearDown的过程很重要,要为下一个test case留下一个干净的环境。
理解了前面几个概念之后,我们在结合例子来学习。
from calculator import Count
import unittest
#测试两个整数相加
class TestCount(unittest.TestCase):
def setUp(self):
print('test start')
def test_add(self):
j = Count(2,3)
self.assertEqual(j.add(),5)
def test_add2(self):
j = Count(40,30)
self.assertEqual(j.add(),70)
def tearDown(self):
print("test end")
#执行测试类的测试方法
if __name__ == '__main__':
#构造测试集
suite = unittest.TestSuite()
suite.addTest(TestCount("test_add2"))
#执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
在前面例子的基础上编写了第二个测试用例test_add2()。由于第一个测试用例已经运行通过,因此这次只需要运行第二条测试用例。在代码的最后,我们去掉了main()方法,采用构造测试集的方法来加载与运行测试用例,实现了有选择地执行测试用例。当然,也可以通过注释的方式注释掉第一条用例,但这种做法并不优雅。
首先,调用unittest框架的TestSuite()类来创建测试套件,通过它所提供的addTest()方法来添加测试用例test_add2()。接着调用unittest框架的TextTestRunner()类,通过它下面的run()方法来运行suite所组装的测试用例。执行结果如下。
从执行结果可以看到,setUp/tearDown作用于测试用例的开始与结束。
原文地址:https://www.cnblogs.com/lirongyang/p/11505035.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器
- ggplot_QQ图和ECDF
- tidyverse evaluation
- 下载歌曲的时候嫌麻烦?打造专属你的音乐下载器
- Tidyverse补充
- 抖音关键词热度搜索小程序(附源码)
- python自定义函数基础
- Python-科学计算-pandas-13-列名/删除列/替换nan
- python小程序,45行代码实现可切换版代码雨(附源码)
- R海拾遗-stringr
- stringr2
- Kubernetes 无状态应用的一般特征
- 一段简单的代码,能让所有GIF图实现时光倒流
- 你喜欢的女主播颜值多少分,今天带你测试虎牙直播女主播的颜值
- (译)kubectl 的奇技淫巧