上篇已经介绍了单个模块的用例执行,如果多个模块的话需要去收集每个模块的用例,然后执行,最终生成测试报告。
接下来继续完善项目,写个简单的注册模块以test_开头;这时候需要把test_login,test_register的用例收集在一起,所以需要在创建一个用来运行所有用例的文件run_cases(放在项目的根目录)。
项目目录如下:
test_register.py代码如下:
#注册功能
def register(phone,code):
if phone!='' and code!='':
if len(phone)==11 and code=='1234':#手机号与验证码正确
return {'mgs':'注册成功'}
else:
return {'mgs':'手机号或验证码错误'}#手机号或验证码错误
return {'mgs':'手机号或验证码为空'}#手机号或验证码为空
#测试用例
import unittest
class TestRegister(unittest.TestCase):
def test_register_success(self):
phone='13800138000'
code='1234'
expect_result={'mgs':'注册成功'}
actual_result=register(phone,code)
self.assertTrue(expect_result==actual_result)
def test_register_error(self):
phone='123456'
code='4567'
expect_result = {'mgs': '手机号或验证码错误'}
actual_result = register(phone, code)
self.assertTrue(expect_result == actual_result)
def test_register_empty(self):
phone=''
code=''
expect_result = {'mgs': '手机号或验证码为空'}
actual_result = register(phone, code)
self.assertTrue(expect_result == actual_result)
TestSuite与TestLoader
TestSuite:把所有用例存进来
TestLoader():用例加载
TestLoader().discover(path):通过目录去自动查找以test_开头的用例;path为用例文件的路径
代码如下:
import unittest
import os
#找到用例文件的绝对路径
path=os.path.abspath(__file__)
dir_path=os.path.dirname(path)
cases_path=os.path.join(dir_path,'test_cases')
loader=unittest.TestLoader()#实例化加载器
test_suite=loader.discover(cases_path)#使用loader收集所有的测试用例,用一个变量接收
#这里的test_suit就是unittest.Testsuite
print(test_suite)
先来看一下运行结果:可以看到两个模块的测试用例都收集了起来,存放到一个列表里。
<unittest.suite.TestSuite
tests=[<unittest.suite.TestSuite
tests=[<unittest.suite.TestSuite
tests=[<test_login.TestLogin testMethod=test_login_empty>,
<test_login.TestLogin testMethod=test_login_error>,
<test_login.TestLogin testMethod=test_login_success>]>]>,
<unittest.suite.TestSuite
tests=[<unittest.suite.TestSuite tests=[<test_register.TestRegister testMethod=test_register_empty>,
<test_register.TestRegister testMethod=test_register_error>,
<test_register.TestRegister testMethod=test_register_success>]>]>]>
如果只想收集登录模块的用例可以用LoadTestsFromModule(test_login)如下:
from Testdemo.test_cases import test_login#导入收集用例的模块
loader=unittest.TestLoader()#实例化加载器
case=loader.LoadTestsFromModule(test_login)#收集用例
print(case)
结果如下:只收集了登录功能的用例
<unittest.suite.TestSuite
tests=[<unittest.suite.TestSuite
tests=[<Testdemo.test_cases.test_login.TestLogin testMethod=test_login_empty>, <Testdemo.test_cases.test_login.TestLogin testMethod=test_login_error>, <Testdemo.test_cases.test_login.TestLogin testMethod=test_login_success>]>]>
假如有abcd四个模块,我只想收集a与b模块的用例,可以使用LoaderTestFromModule()方法收集a与b的用例后使用unittest.TestStuie()里面的addTests([a_case,b_case])放在一起。如下:
import a,b#导入a b 模块
loader=unittest.TestLoader()#实例化加载器
total=unittest.TestSuite()#初始化一个suite
a_case=loader.LoaderTestFromModule(a)#收集a的用例
b_case=loader.LoaderTestFromNodule(b)#收集b的用例
total.addTests([a_case,b_case)#用例放在一起
——————————————————————————————————————————————
收集完用例后需要执行。
unittest.TextTestRunner()
runner=unittest.TextTestRunner#实例化
runner.run(test_suite)#run()方法去执行测试用例
来看一下执行结果:F代表failed,点代表passed
unittest的TextTestRunner是可以自动生成文本格式的报告,来看一下是如何实现的:
with open('txt_report.txt','w',encoding='utf-8') as f:#新建文档,用于存放测试结果
runner=unittest.TextTestRunner(f,verbosity=2)#verbosity测试结果的详细程度
runner.run(test_suite)#执行
报告如下:
以上这种文本格式的不推荐使用(有点low),一般常用的是HTML格式的测试报告,使用第三方模块HTMLTestRunnerNew,需要自己下载,下载后放到Lib或site-packages里面就行了。
链接: https://pan.baidu.com/s/1cX1-HMkONqDpkzQ_M8VWYw
提取码: 46ce
如下:
title(标题),description(描述),tester(测试人员)自己定义;
需要注意文件要以html格式创建,以‘+b’的模式写入。
with open('txt_report.html','wb') as f:
runner=HTMLTestRunner(f,title='2020年5月26日自动化测试报告',
description='登录与注册模块测试',
tester='tester',
verbosity=2)
runner.run(test_suite)
最后看完整代码如下:
from HTMLTestRunnerNew import HTMLTestRunner
import unittest
import os
path=os.path.abspath(__file__)
dir_path=os.path.dirname(path)
cases_path=os.path.join(dir_path,'test_cases')
loader=unittest.TestLoader()
test_suite=loader.discover(cases_path)#收集测试用例
with open('txt_report.html','wb') as f:
runner=HTMLTestRunner(f,title='2020年5月26日自动化测试报告',
description='登录与注册模块测试',
tester='tester',
verbosity=2)
runner.run(test_suite)
执行完后会生成一份测试报告,在浏览器中打开就行,如下:
一共有6条用例,失败1条,通过5条。