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

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) # 添加用例到测试套件中

# 方式二:添加多条用例

case1 = test_demo.RegisterTest(‘test_username_exist’)

case2 = test_demo.RegisterTest(‘test_username_isnull’)

suit.addTest([case1, case2]) # 添加用例到测试套件中。注意这里使用的是suit.addTest()方法而不是suit.addTests()方法

# 方式三:添加一个测试用例集

loader = unittest.TestLoader() # 创建一个加载对象

suit.addTest(loader.loadFromTestCase(test_demo.RegisterTest)) # 通过加载对象从测试类中加载用例到测试套件中

‘’’

通产我们使用方式4、5比较多,可以根据实际情况来运用。

其中方式5还可以自定义匹配规则,默认是会寻找目录下的test*.py文件,即所有以test开头命名的py文件。

‘’’

# 方式四:添加一个模块(其实就是一个后缀名为.py文件,这里就是test_demo.py文件)

loader = unittest.TestLoader() # 创建一个加载对象

suit.addTest(loader.loadTestsFromModule(test_demo)) # 通过加载对象从模块中加载测试用例到测试套件中

方式五:指定测试用例的所在目录路径,进行加载

loader = unittest.TestLoader() # 创建一个加载对象
case_path = os.path.dirname(os.path.abspath(file)) # 文件路径

print(‘用例所在的目录路径为:’, case_path)

suit.addTest(loader.discover(case_path)) # 通过加载对象从用例所在目录加载测试用例到测试套件

suit.addTest(loader.discover(start_dir=case_path, pattern=‘test_demo*.py’)) # 两个参数:路径和匹配规则

TestRunner执行用例
testRunner用来执行用例,并且可以生成相应的测试报告。测试报告有两种形式:一种是 text文本;一种是 html格式。

html格式是 HTMLTestRunner插件辅助生成的,是Python标准库的unittest框架的一个拓展,可以生成一个清晰直观的html测试报告。使用的前提就是需要下载 HTMLTestRunner.py,下载完成后放在python安装目录下的scripts目录下即可。

text文本相对于html来说过于简陋,与输出控制台没有什么区别,也几乎不适用。

代码示例:

demo.py,与test_demo.py和run_test.py在同一目录下

导入模块

import unittest
import os
import test_demo
from HTMLTestReportCN import HTMLTestRunner

用例文件所在目录

base_path = os.path.dirname(os.path.abspath(file))

report_path = base_path + ‘report.html’

打开报告文件

创建测试套件

suit = unittest.TestSuite()

通过模块加载测试用例

loader = unittest.TestLoader()
suit.addTest(loader.discover(start_dir=base_path, pattern=‘test_demo*.py’))

创建测试运行程序启动器

runner = HTMLTestRunner(
stream=open(‘report.html’, ‘w’, encoding=‘utf-8’), # 打开一个报告文件,并将句柄传给stream
tester=‘palien’, # 报告中显示的测试人员
description=‘注册接口测试报告’, # 报告中显示的描述信息
title=‘自动化测试报告’ # 测试报告标题
)

使用启动器去执行测试套件里面的测试用例

runner.run(suit)

相关参数说明:

stream:指定输出方式
tester:报告中要显示的测试人员的名字
description:报告中要显示的描述信息
title:测试报告的标题
verbosity:表示测试报告信息的详细程度,一共三个值,默认为2
0(静默模式):只能获得总的测试用例书和总的结果,如:总共100个,失败90
1(默认模式):类似静默模式,只是在在每个成功的用例面前有个. 每个失败的用例前面有个F
2(详细模式):测试结果会显示每个测试用例的所有相关信息
运行完毕,在项目目录下面会生成一个report.html文件,在浏览器中打开,就可以看到测试报告了。

问题记录

在学习的过程中遇到了一些问题,记录一下。

  • HTMLTestRunner下载

经验证,以下两个文件就支持生成上面截图的报告。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

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

软件测试开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-VZvf7BSH-1712991102706)]

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

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值