1、概念介绍
unit test:单元测试,可以简单粗暴地理解成用一段代码去测试另外一段代码。unittest作为Python单元测试框架之一,除了用来做单元测试之外,还可以用来完成接口自动化,UI自动化(配合Selenium使用),自动化框架开发等。
test fixture:测试用例执行前的准备工作以及测试用例执行完成后的清理工作。比如数据库测试前要建立连接,测试后要关闭连接。
test case:单元测试中最小的单元。
test suite:测试套件是测试用例,测试套件或者两者的集合。通常被用来把测试用例组织起然后交给test runner执行。
test runner:测试执行器是执行用例并向用户展示结果的组件。
2、准备工作
2.1、开发环境
操作系统:Ubuntu 18.04.1 LTS
Python版本:3.7.0
开发工具:PyCharm Edu
本机已安装MySQL
代码结构

2.2、创建数据库和表
登录数据库创建数据库ums,在数据库中创建表user_info,SQL语句如下:

2.3、编写简单的注册登录代码
在Project下新建Python包 userManage ,在该包下创建Python文件userRegLogin.py。注册时先判断是否存在状态为active的用户,不存在则更新信息到数据库中。登录时先判断用户状态,如果为active则去数据库中查询其密码并比较密码是否正确。userRegLogin.py的代码如下:

2.4、运行结果
在userRegLogin.py文件末尾插入代码并执行

登录数据库查看结果

2.5、测试场景
注册时存在同名状态为active的用户,返回SameNameError
注册成功,返回regSucess
注册密码长度不符合要求,返回passwordLenError
登录成功,返回loginSucess
登录密码不对,返回passwordError
登录状态为inactive,返回UserStatusError
3、一个简单的例子
在Project下新建Python包testCases,在testCases下新建Python文件userRegTest.py,用来编写测试用户注册功能的代码。
[示例1]:userRegTest.py

[示例1运行结果]:

测试类继承与unittest.TestCase
一个测试用例就是Python中的一个函数。
测试用例必须要以test开头
4、test fixture
test fixture包含两个方法,setUp(self)和tearDown(self)分别用于执行测试用例前的准备工作和执行完测试用例后的清理工作。这个两个方法会在每个用例的执行前或执行后被调用。把准备和清理工作和测试用例放在会导致很多重复代码且不易维护。test fixture的使用场景到底是什么样的呢?
场景一:比如说用户注册时会先校验数据库中是否存在状态为active的同名用户,那么该用例执行过之后,需要清理user_info表中的记录,这个动作就是在tearDown(self)方法中完成的,否则再次执行就会报错。
场景二:要验证同名用户名无法注册的异常场景,需要先注册一次或者手动在user_info表里面插入数据,这个动作就是在setUp(self)中完成的。
4.1、setUp和tearDown示例
把被测类实例化放在setUp()f方法里面。正常注册场景的清理动作:删除表user_info中对应的记录放在tearDown()方法中。接下来完善一下示例1中的代码:
[示例2]:userRegTest.py

[示例2运行结果]:

如果setUp()执行成功,那么不论用例是否执行成功,tearDown()都会执行。
如果setUp()执行失败,那么用例及tearDown()方法都不会被执行。
如果只想在所有用例执行之前只执行一次准备工作怎么操作呢?那就需要用到setUpClass() 和 tearDownClass()了。在这两个方法内部可以自己编写函数实现准备工作或清理动作。
4.2、setUpClass 和 tearDownClass
[示例3]:

注意:没有清理动作如果想要用例跑成功的话需要手动删除表里对应的用户信息或者修改注册时传入的name。
[示例3运行结果]::

5、测试套
5.1、登录功能测试
在包testcases下新建Python文件userLoginTest.py,编写测试登录功能的代码。
[ 示例4 ]:userLoginTest.py

[ 示例4运行结果 ]:

5.2、组织用例
unittest通过类unittest.TestSuite来组织测试用例。这个类返回测试用例或测试套的集合,它可以被test runner执行。运行一个测试套相当于test runner把测试套迭代,然后执行每一个测试用例。 一些方法可以将用例添加到测试套中。
addTest(test):添加一个TestCase或TestSuite到套件中。
addTests(tests):把TestCase和TestSuite中给的所有的测试实例添加到套件中。
TestSuite和TestCase都有如下方法:
countTestCases():返回测试用例的数量。
run(result):运行套件相关的测试用例,收集测试结果到result对象中并传给result。
在Project下创建Python文件run.py,通过TestSuite来组织注册登录所有的用例并运行。
[ 示例5 ]:run.py

[ 示例5运行结果 ]:

网友评论