Python 单元测试框架-unittest (一)

(一)什么是单元测试?
首先单元是指某个模块中的函数或类,在编写类或函数时,还可以为其编写测试,通过测试可以确定代码的执行结果与预期结果是否一致。其好处,能够精准的,更早的发现问题。

(二)unittest模块
unittest模块是Python自带的一个单元测试模块,主要包括以下几个核心内容:
TestCase:测试用例,一个TestCase的实例就是一个测试用例。
TestSuite:测试套件,多个测试用例集合在一起。
TestLoader:加载用例,加载TestCase到TestSuite中。
TextTestRunner:执行测试用例
fixture:用于测试用例环境的搭建和销毁。
unittest.main():可以方便的将测试类里的以“test”命名开头的测试方法以脚本的形式自动执行。

(三)实例:
接下来编写一个简单的登录函数,使用unintest框架来进行单元测试,对unintest有个基本的认识。目录如下,被测代码放在login.py里面,执行代码放在test_login.py里面。
在这里插入图片描述
登录功能:

#登录功能
def login(username='',password=''):
    
    if username!='' and password!='':
        
        if username=='admin' and password=='123456':#账号密码正确登录成功
            
            return {
     'msg':'登录成功'}
        
        else:#账号密码错误
            
            return {
     'msg':'账号或密码不正确'}
    
    return {
     'msg':'账号或密码为空'}#账号或密码为空

此次只针对登录功能来编写测试用例,以测试函数是否正常运行,从测试角度出发简单设计几条用例如下:

1.账号密码输入正确
入参:username=‘admin’ , password=‘123456’
预期结果:{‘msg’:‘登录成功’}

2.账号或用户名不正确
入参:username=‘ADMIN’ , password=‘123456’
预期结果:{‘msg’:‘账号或密码不正确’}

3.账号或密码为空
入参:username=‘ ’ , password=‘ ’
预期结果:{‘msg’:‘账号或密码为空’}
——————————————————————————————————————————————
接下来在python中根据设计好的用例去编写测试代码,主要分为以下步骤:
1.导入unittest模块、被测文件。
2.创建一个测试类以Test…开头,并继承unittest.TestCase类。
3.引入fixture,做一些准备及结束工作:
setup():每条用例执行前都会执行
tearDown():每条用例执行后都会执行
setUpClass():类方法,整个测试类只执行一次前置
tearDownClass():类方法,整个测试类执行一次的后置
4.定义测试函数,也就是上面设计好的用例,这里转换成代码,函数命名必须以test_开头,否则unittest识别不到。
5.调用unittest.main()运行以test_开头的测试用例。
——————————————————————————————————————————————
在执行完测试用例后,最后一步需要判断预期结果与实际结果是否一致,并输出测试结果是pass还是fail,这种方法称为断言(assert)。
如下部分断言方法:
Python 单元测试框架-unittest (一)_第1张图片
这里介绍几种常用的断言方法:
assertEqual(a,b):a == b
asserNotEqual(a,b):a != b
asserTrue(x):bool(x) is True
asserFalse(x):bool(x) is False
asserIn(a,b):a in b
asserNotIn(a,b):a not in b
asserIsNone(x):x is None
asserIsNotNone(x):x is not None

完整代码如下:

import unittest#导入模块
from Test_login.login import login#导入被测文件
class TestLogin(unittest.TestCase):#定义测试类继承unittest.TestCase类
    def setUp(self):#执行每条用例前都会执行
        print('每条用例执行前的前置条件')
    @classmethod
    def setUpClass(cls):#类方法,整个测试类只执行一次前置
        print('只执行一次的前置条件')
    @classmethod
    def tearDownClass(cls):
        print('只执行一次的后置条件')#类方法,整个测试类执行一次的后置
    def tearDown(self):
        print('每条用例执行后的后置条件')#执行每条用例以后都会执行
    def test_login_success(self):#登录成功用例
        username='admin'
        password='123456'
        login(username,password)
        expected_result={
     'msg':'登录成功'}#预期结果
        actual_result=login(username,password)#调用被测函数
        self.assertTrue(expected_result==actual_result)#判断预期结果与实际结果是否一致
    def test_login_error(self):#账号或密码错误用例
        username='ADMIN'
        password='456789'
        expected_result={
     'msg':'账号或密码不正确'}#预期结果
        actual_result=login(username,password)
        self.assertTrue(expected_result==actual_result)
    def test_login_empty(self):#账号或密码为空用例
        username=''
        password=''
        expected_result={
     'msg':'账号或密码为空'}#预期结果
        actual_result=login(username,password)
        self.assertTrue(expected_result==actual_result)
if __name__=='__main__':
    unittest.main()

执行用例时鼠标右键点击空白处,选择Run‘ ’Unittests in …'运行代码。在这里插入图片描述
如果没有此选项这里需要修改一下,如下:
Python 单元测试框架-unittest (一)_第2张图片
测试结果:
Python 单元测试框架-unittest (一)_第3张图片

把登录成功的预期结果改一下{‘msg’:‘200’},再来看下用例执行未通过结果。
如下部分代码:

Python 单元测试框架-unittest (一)_第4张图片
执行结果:
Python 单元测试框架-unittest (一)_第5张图片
这时候可以打断点Debug一下,如下可以看到实际结果与预期结果不一致。
Python 单元测试框架-unittest (一)_第6张图片
这里简单说下Debug模式下常用的功能:
Python 单元测试框架-unittest (一)_第7张图片
横排:
1.show execution point (Alt+F10 显示当前所有断点
2.step over(F8) 单步执行,继续执行下一行
3. step into(F7)单步执行 与step over的区别会执行到函数内部
4.step into my code(Alt + Shift +F7) 执行下一行,只执行自己写的code,导入库的语句不会执行
5. step out (shift+out)跳出函数
6.run to cursor(Alt +F9) 执行到光标的位置
7.Evaluate Expression(Alt+F8)进一步调式运行结果
竖排:
1.以Debug模式重新运行
2.直接运行到下一个断点
3.停止运行
4.显示所有断点
5.关闭所有断点

这里只是执行了一个登录模块的用例,但是如果还有注册等模块,用例不能都写在登录的用例里面,需要每个模块的用例分开管理;但是如果有上百个模块的用例,不能每次都手动去执行单个模块的用例,这时候需要用TestSuite去收集用例。

下篇继续…

你可能感兴趣的:(python,单元测试,python,unittest,软件测试)