-
UnitTest
unitTest四大特色:
1.测试用例管理(TestCase):所有的用例都是直接继承UnitTest.TestCase类
2.测试套件(TestSuite)和运行器(TestRunner):TestRunner 类作为测试用例的基本执行环境,来驱动整个单元测试过程,单元测试时一般不直接使用 TestRunner 类,而是使用其子类 TextTestRunner 来完成测试,并将测试结果以文本方式显示出来。
3.Setup和Teardouwn前置和后置条件
setUp/tearDown 每一条用例运行前会执行前置,运行后执行后置
setUpClass/tearDownClass 使用前必须定义装饰器@classmethod,是在类中所有用例前/后执行一次
4.断言机制,只需要通过self.即可直接调用unittest默认的加载顺序:A-Z,a-z,0-9
默认规则:测试用例方法必须使用test_开头
skip跳过:
无条件跳过本条用例:@unittest.skip(‘跳过原因描述’)
有条件跳过本条用例:
条件表达式为False则跳过@unittest.skipUnless(条件表达式,‘跳过原因描述’)
条件表达式为True则跳过@unittest.skipIf(条件表达式,‘跳过原因描述’)
断言失败报错则忽略:@unittest.expectedFailure
测试用例套件添加的几种方法和HTMLTestRunner报告的生成代码
#-*-coding:utf-8-*-
'''
测试套件添加必须新建一个类对象存放套件,直接在UnitTest类(即测试用例的main方法)中运行无法生效
'''
import os
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
from UnitTestBase import one,one_1
#方法一
# #创建一个测试套件
# suite=unittest.TestSuite()
# #添加测试用例
# suite.addTest(One('test_1'))
# suite.addTest(One('test_3'))
# suite.addTest(One('test_5'))
# #基于Runner来运行测试套件
# runner=unittest.TextTestRunner()
# runner.run(suite)
#方法二
# suite=unittest.TestSuite()
#批量添加测试用例
# cases=[One('test_2'),One('test_3')]
# suite.addTests(cases)
# runner=unittest.TextTestRunner()
# runner.run(suite)
#方法三
#测试用例放的目录
# test_path='./'
# #指定路径下匹配的文件添加进来
# discover=unittest.defaultTestLoader.discover(start_dir=test_path,pattern='one*.py')
# runner=unittest.TextTestRunner()
# runner.run(discover)
#方法四
# suite=unittest.makeSuite(one_1.Two,prefix='test_')
# runner=unittest.TextTestRunner()
# runner.run(suite)
# #方法五,one.One 指文件名.方法类名
# suite=unittest.TestSuite()
# #suite.addTests(unittest.TestLoader().loadTestsFromTestCase(one.One))
# suite.addTests(unittest.TestLoader().loadTestsFromNames(['one.One','one_1.Two']))
# runner=unittest.TextTestRunner()
# runner.run(suite)
#HTMLTestRunner测试报告的生成
suite=unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromNames(['one.One','one_1.Two']))
now = time.strftime("%Y-%m-%d %H_%M_%S")
report_file = "../report/"+now+'resultReport.html'
report_path='../report/'
#判断测试报告文件report_path是否存在
if not os.path.exists(report_path):
#不存在就创建
os.mkdir(report_path)
else:
pass
with(open(report_file,mode='wb')) as report:
runner = HTMLTestRunner(stream=report,title='测试报告标题',description='环境:windows 10 接口环境:线上')
runner.run(suite)
-
pytest
Pytest框架默认的测试用例规则:
设计用例原则:
文件名以test_.py文件和_test.py
函数以test开头
类以Test开头
所有的包pakege必须要有__init__py文件pytest中参数代表的含义:
-s 输出调试信息
-v 输出测试用例的详细信息
-n 多个线程执行(-n=3代表3个线程执行)
–reruns 失败用例重跑(–reruns=3失败的用例重跑3次)
-k 执行包含特定字符的用例:pytest xx.py -k “包含字符”
–collect-only 统计用例数并列举出来(例如:了解给定目录下有多少测试用例:pytest --collect-only 查找名字中包含特定字符的用例:pytest -k “字符 or 字符” --collect-only 标记测试分组并运行标记的用例:pytest -m “标记运行的名字” --collect-only)
-m 标记测试分组(多个用or连接):pytest -m "标记运行的名字 "
配置文件:
pytest.ini配置文件:(该文件的 作用改变pytest默认规则和行为)
pytest.ini配置文件规则:一般放在项目工程的根目录下,编码格式需要改成ANSI,不管命令方式还是主函数方式都会读取pytest.ini文件,pytest.ini可以改变pytest默认的测试执行的执行规则
pytest.ini文件内容如下:
[pytest]
执行命令的参数,多个命令之间用空格分隔:addopts= -vs -x
测试用例默认执行路径:testpaths=./TestCase
模块名的规则:python_files=项目名称*.py
类名规则:python_classes=Test*
方法名的规则:python_functions=用例开头名称
冒烟测试标记:
markers=
smoke:冒烟用例
模块标记名称:模块conftest.py配置文件:主要是实现fixture共享,用处是在不同的py文件中使用同一个fixture函数
conftest.py配置文件规则:conftest.py配置脚本名称是固定的不能改名称;conftest.py与运行的用例要在同一个pakage下,并且有init.py文件;不需要import导入 conftest.py,pytest用例会自动查找pytest测试用例的运行方式:
主函数模式运行
在main函数里:
运行所有pytest.main()
运行指定模块用例:pytest.main([‘指定模块名’,‘参数’])
通过nodeid指定用例运行:nodeid由模块名,分隔符,类名、方法名,函数名组成。例如:test.py::TestClass::funmingc()
比如:(–clean-alluredir 清楚原始数据 -c在生成报告之前先清理之前的报告目录 -o指定生成报告的文件夹 使用generate命令导出HTML报告到新的目录)
回归测试中只执行某优先级别的用例,比如只执行blocker,critical的用例:“–allure-severities=blocker,critical”pytest实现一些前后置(比如打开浏览,关闭或登录退出的操作)的处理,常见三种:
第一种方式:使用setup/teardown、setup_class/teardown_class、setup_module/teardown_module来实现所有用例的前后置。
第二种方式:使用@pytest.fixture()装饰器来实现部分用例的前后置。
@pytest.fixture(scope=‘’,params=’’,autouse=’’,ids=’’,name=’’)参数代表的含义
scope表示的是被@pytest.fixture标记的方法的作用域function(默认),class,module(module可以实现多个.py跨文件共享前置),package/session(以实现多个.py跨文件使用一个session来完成多个用例)
params:参数化数据,支持列表,元组和字典
autouse=True表示自动使用,默认不自动使用False
ids:当使用params参数化时,给每一个值设置一个变量名。
name:给表示的是被@pytest.fixture标记的方法取一个别名。
yield:fixture里面的teardown用yield来唤醒teardown的执行,Fixtures可以选择使用yield语句为测试函数提供它们的值,而不是return
第三种:通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用(比如,项目的全局登录,模块的全局处理)skip跳过测试用例:
无条件跳过某测试用例,在需要跳过的用例/模块前标记:@pytest.mark.skip(reason=‘跳过原因’)
满足某条件就跳过,在需要跳过的用例/模块前标记:@pytest.mark.skipif(跳过的条件当条件为true跳过,reason=‘跳过原因’)
缺少某些导入就跳过,在需要跳过的用例/模块前标记:pexpect = pytest.importorskip(“pexpect”)
pytest执行测试用例的顺序:
pytest默认从上到下执行,若要改变执行顺序使用mark标记,在用例前使用如下@pytest.mark.run(order=执行编号)
运行测试用例并生成allure测试报告代码
#-*-coding:gbk-*-
import pytest
import os
if __name__ == '__main__':
#执行测试用例获取测试数据和数据目录
pytest.main(['-s','test_pytest.py','--alluredir','../allure-results','--clean-alluredir'])
# 生成html测试报告 找到测试数据 生成测试报告目录
os.system('allure generate ../allure-results -c -o ../report')
#直接驱动服务打开
os.popen('allure serve ../allure-results')
UnitTest和pytest的区别