UnitTest和Pytest的区别

  • 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的区别
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值