unittest自动化测试框架讲解以及实战_unittest框架实际应用

test suit:测试套件。用来把需要一起执行的测试用例几种放到一块执行,相当于一个篮子。我们一般使用 TestLoader来加载测试用例到测试套件中。
test runner:测试运行。用来执行测试用例的,并返回测试用例的执行结果。可以结合图形或者文本接口,把返回的测试结果更形象的展示出来,如 HTMLTestRunner.
unittest断言
断言是测试用例的中很重要的一部分内容,可以用来检查操作是否正确。比如说登入处理,成功后的页面一定有类似于用户名称之类的元素,这个时候我们就可以使用断言判断预期结果与实际是否一致,如果吻合,就可以认为测试用例通过。

在Python基础中,有一个 assert断言方法,基本使用格式为 assert 表达式,基本信息。在unittest框架中,也提供了一个自带的断言方式,如果断言失败即不通过就会抛出一个 AssertionError断言错误;成功则标识通过。

以下的断言方法都有一个 msg=None参数(表中只列出了第一个,其实都有),默认返回 None。但是如果指定msg参数的值,则将该信息作为失败的错误信息返回。

方法    检查
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(x, 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)

TestCase测试用例
编写测试用例前,我们需要创建一个类继承unittest里面的TestCase类,之后我们才能真正的使用unittest框架去编写测试用例.

步骤如下:

导入unittest模块
创建一个测试类,继承unittest.TestCase类
定义测试方法,方法名必须以test_开头
调用unittest.main()方法来运行测试用例。unittest.main()方法会搜索该模块下所有以test开头的测试用例和方法,并自动执行。
代码示例

# 注册功能代码
 
# users列表存储成功注册的用户
users = [{'username': 'testing', ''}]  
 
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 <= len(username) <= 18 and 6 <= len(password1) <= 18:
        # 追加到users列表
        users.append({'username': username, 'password': password2})
        return {'code': 0, 'msg': '注册成功.'}
      else:
        return {'code': 0, 'msg': '用户名和密码的长度必须在6~18位之间.'}
  
  
 
 
import unittest
from demo import register # 导入被测试代码
 
class RegisterTest(unittest.TestCase):
    '''注册接口测试类'''
  
    def test_register_success(self):
        '''注册成功'''
        data = ('palien', 'palien', 'palien') # 测试数据
        result = register(*data) # 测试结果
        expected = {'code': 0, 'msg': '注册成功.'} # 预期结果
        self.assertEqual(result, expected) # 断言测试结果与预期结果一致
        # pass
  
    def test_username_exist(self):
        '''注册失败-用户名已存在'''
        data = ('testing', '123456', '123456')
        result = register(*data)
        expected = {'code': 0, 'msg': '用户名已存在!'}
        self.assertEqual(result, expected)
  
    def test_username_isnull(self):
        '''注册失败-用户名为空'''
        data = ('', 'palien', 'palien')
        result = register(*data)
        expected = {'code': 0, 'msg': '所有参数不能为空.'}
        self.assertEqual(result, expected)
        # pass
  
    def test_username_lt18(self):
        '''注册失败-用户名长度大于18位'''
        data = ('palienpalienpalienpalien', 'palien', 'palien')
        result = register(*data)
        expected = {'code': 0, 'msg': '用户名和密码的长度必须在6~18位之间.'}
        self.assertEqual(result, expected)
        # pass
  
    def test_password1_not_password2(self):
        '''注册失败-两次输入密码不一致'''
        data = ('palien', 'palien1', 'palien2')
        result = register(*data)
        expected = {'code': 0, 'msg': '两次密码输入不一致!'}
        self.assertEqual(result, expected)
        # pass
  
# 如果要直接运行这个测试类,需要使用unittest中的main函数来执行测试用例
if __name__ == '__main__':
    unittest.main()
 
# Output
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
 
尝试新的跨平台 PowerShell https://aka.ms/pscore6
 
PS D:\d_02_study\01_git> cd d:/d_02_study/01_git/papers/system/02automation
PS D:\d_02_study\01_git\papers\system\02automation> & C:/Users/TDH/AppData/Local/Programs/Python/Python310-32/python.exe d:/d_02_study/01_git/papers/system/02automation/demo.py
.....
----------------------------------------------------------------------
Ran 5 tests in 0.001s
 
OK
PS D:\d_02_study\01_git\papers\system\02automation> 

TestFixture测试夹具

unittest的测试夹具有两种使用方式,一种是以测试用例的方法为维度的:setUp()和 tearDown();另一种是以测试类为维度的:setUpClass()和 tearDownClass()

代码示例:

# users列表存储成功注册的用户
users = [{'username': 'testing', '}]  
 
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 <= len(username) <= 18 and 6 <= len(password1) <= 18:
        # 追加到users列表
        users.append({'username': username, 'password': password2})
        return {'code': 0, 'msg': '注册成功.'}
      else:
        return {'code': 0, 'msg': '用户名和密码的长度必须在6~18位之间.'}
  
  
 
 
import unittest
from demo import register # 导入被测试代码
 
class RegisterTest(unittest.TestCase):
    '''注册接口测试类'''
  
    @classmethod # 指明这是个类方法,以类为维度去执行的
    def setUpClass(cls) -> None:
          '''整个测试用例类中的用例执行之前,会先执行此方法'''
          print('-----setup---class-----')
  
    @classmethod
    def tearDownClass(cls) -> None:
          '''整个测试用例类中的用例执行完成后,会执行此方法'''
          print('-----teardown---class-----')
  
    def setUp(self):
        '''每条测试用例执行前都会执行'''
        print('用例{}开始执行...'.format(self))
  
    def tearDown(self):
        '''每条测试用例执行结束后都会执行'''
        print('用例{}执行结束...'.format(self))
  
    def test_register_success(self):
        '''注册成功'''
        data = ('palien', 'palien', 'palien') # 测试数据
        result = register(*data) # 测试结果
        expected = {'code': 0, 'msg': '注册成功.'} # 预期结果
        self.assertEqual(result, expected) # 断言测试结果与预期结果一致
        # pass
  
    def test_username_exist(self):
        '''注册失败-用户名已存在'''
        data = ('testing', '123456', '123456')
        result = register(*data)
        expected = {'code': 0, 'msg': '用户名已存在!'}
        self.assertEqual(result, expected)
  
    def test_username_isnull(self):
        '''注册失败-用户名为空'''
        data = ('', 'palien', 'palien')
        result = register(*data)
        expected = {'code': 0, 'msg': '所有参数不能为空.'}
        self.assertEqual(result, expected)
        # pass
  
    def test_username_lt18(self):
        '''注册失败-用户名长度大于18位'''
        data = ('palienpalienpalienpalien', 'palien', 'palien')
        result = register(*data)
        expected = {'code': 0, 'msg': '用户名和密码的长度必须在6~18位之间.'}
        self.assertEqual(result, expected)
        # pass
  
    def test_password1_not_password2(self):
        '''注册失败-两次输入密码不一致'''
        data = ('palien', 'palien1', 'palien2')
        result = register(*data)
        expected = {'code': 0, 'msg': '两次密码输入不一致!'}
        self.assertEqual(result, expected)
        # pass
  
# 如果要直接运行这个测试类,需要使用unittest中的main函数来执行测试用例
if __name__ == '__main__':
    unittest.main()
 
 
### Output
PS D:\d_02_study\01_git> cd d:/d_02_study/01_git/papers/system/02automation
PS D:\d_02_study\01_git\papers\system\02automation> & C:/Users/TDH/AppData/Local/Programs/Python/Python310-32/python.exe d:/d_02_study/01_git/papers/system/02automation/demo.py
-----setup---class-----
用例test_password1_not_password2 (__main__.RegisterTest)开始执行...   
用例test_password1_not_password2 (__main__.RegisterTest)执行结束...   
.用例test_register_success (__main__.RegisterTest)开始执行...
用例test_register_success (__main__.RegisterTest)执行结束...
.用例test_username_exist (__main__.RegisterTest)开始执行...
用例test_username_exist (__main__.RegisterTest)执行结束...
.用例test_username_isnull (__main__.RegisterTest)开始执行...
用例test_username_isnull (__main__.RegisterTest)执行结束...
.用例test_username_lt18 (__main__.RegisterTest)开始执行...
用例test_username_lt18 (__main__.RegisterTest)执行结束...
.-----teardown---class-----
 
----------------------------------------------------------------------
Ran 5 tests in 0.004s
 
OK
PS D:\d_02_study\01_git\papers\system\02automation> 

TestSuit测试套件
unittest.TestSuit()类用来表示一个测试用例集,把需要执行的用例类或模块集合在一起。

常用的方法:

unittest.TestSuit()
addTest():添加单个测试用例方法
addTest([…]):添加多个测试用例方法,方法名存在一个列表
unittest.TestLoader()
loadTestsFromTestCase(测试类名):添加一个测试类
loadTestsFromMdule(模块名):添加一个模块
discover(测试用例所在的目录):指定目录去加载,会自动寻找这个目录下所有符合命名规则的测试用例
代码示例:

'''
    以下三个文件必须在同一文件夹下:
    demo.py
    test_demo.py
    run_test.py
'''
 
import os
import unittest
import test_demo
 
# 第一步,创建一个测试套件
suit = unittest.TestSuite()
 
# 第二步,将测试用例加载到测试套件中
 
# # 方式一,添加单条测试用例
# case = test_demo.RegisterTest('test_register_success')
# '''
# 创建一个用例对象。
# 注意:通过用例类去创建测试用例对象的时候,需要传入用例的方法名(字符串类型)
# 这里不是像调用普通类中的方法那样通过类名.方法名调用,可以理解为unittest框架的特殊之处
# '''
# suit.addTest(case) # 添加用例到测试套件中


![img](https://img-blog.csdnimg.cn/img_convert/e02d8b3bf4419e95b92c021bf11e2bff.png)
![img](https://img-blog.csdnimg.cn/img_convert/25db36ba1ffa60c04ecb70ce85031da9.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

用,可以理解为unittest框架的特殊之处
# '''
# suit.addTest(case) # 添加用例到测试套件中


[外链图片转存中...(img-Ph8Ce6rW-1719240161426)]
[外链图片转存中...(img-O9biEbGe-1719240161426)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值