Python测试框架pytest完全指南:从零基础到精通

2024-12-12 0 972

Python测试框架pytest完全指南:从零基础到精通

来谈谈在编程世界里,代码的优劣如同建筑的地基一般重要,测试工作则是保证这一基础稳固的重要环节。这一领域备受关注,那么我们该如何运用高效的测试工具来提升代码的优劣?

软件测试的重要性

软件开发过程中,测试扮演着确保软件品质的关键角色。像在大型互联网企业的项目里,未经充分测试的软件一旦发布,就可能暴露出诸多问题。以2018年为例,某知名应用因一处测试失误,导致用户隐私信息泄露,引发了广泛争议。在软件交付用户前,测试能及早发现并解决问题,减少潜在损失。此外,良好的测试还能增强开发者对后续开发工作的信心。

开发者必须重视测试流程的完善。随着项目规模的扩大,若缺乏严谨的测试环节,代码的维护费用和出错几率将显著上升。

测试框架的广泛应用

# requestment.txt文件
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures

pip install -r requirements.txt

在当前的软件开发领域,测试框架的使用相当广泛。无论是小型初创企业的简单项目,还是大型企业的复杂项目,高效测试框架都是不可或缺的。以一家初创公司为例,在开发一款新型社交软件时,他们选择了某种流行的测试框架。该框架适用于项目初期对基本功能的测试,同时也适用于项目后期功能逐步增多后的复杂测试。

class TestDemo:
    def test_demo1(self):
        print("测试用例1")
    def test_demo2(self):
        print("测试用例2")

一位资深的程序员提到,无论项目规模如何,只要拥有一个稳定且适应性强的测试系统,开发速度和质量都会有明显提高。此外,这样的测试体系还能帮助新来的开发者迅速掌握项目的测试流程。

[pytest]
#参数
addopts = ‐vs
# 默认的执行路径,它会默认执行该文件夹下所有的满足条件的测试case
testpaths = ./testcases	
# 文件命名规则
python_files = test_*.py
# 类名命名规则
python_classes = Test*
# Case命名规则
python_functions = test_*
# 标记
markers =		
# 冒烟规则
smoke:冒烟用例		 
product_manage:商品管理

简洁的语法优势

这个测试框架的一大特点是语法简单。在软件开发过程中,复杂的语法会使得开发者的工作量加大,错误发生的几率也会提高。例如,那些需要继承特定测试类的复杂语法往往是不受欢迎的。

# -vs: -v输出详细信息 -s输出调试信息
pytest -vs
# -n: 多线程运行(前提安装插件:pytest-xdist)
pytest -vs -n=2
# --reruns num: 失败重跑(前提安装插件:pytest-rerunfailres)
pytest -vs --reruns=2
# -x: 出现一个用例失败则停止测试
pytest -vs -x
# --maxfail: 出现几个失败才终止
pytest -vs --maxfail=2
# --html: 生成html的测试报告,后面 需要跟上所创建的文件位置及文件名称(前提安装插件:pytest-html)
pytest -vs --html ./reports/result.html
# -k: 运行测试用例名称中包含某个字符串的测试用例,我们可以采用or表示或者,采用and表示都
pytest -vs -k "qiuluo"
pytest -vs -k "qiuluo or weiliang"
pytest -vs -k "qiuluo and weiliang"
# -m:冒烟用例执行,后面需要跟一个冒烟名称,执行user_manage这个分组
pytest -vs -m user_manage

当前框架下,仅通过简单函数即可实现测试编写。在小型电商项目开发过程中,得益于这种简便的语法,开发人员编写测试用例的效率比以往传统方法提升了近半数。新加入的开发人员也能迅速学会这种测试用例编写技巧,从而降低了培训的开销。

class TestDemo:
    
    # 我们在Case上采用@pytest.mark. + 分组名称,就相当于该方法被划分为该分组中
    # 注意:一个分组可以有多个方法,一个方法也可以被划分到多个分组中
    @pytest.mark.user_manage
    def test_demo1(self):
        print("user_manage_test1")
    @pytest.mark.product_manage
    def test_demo2(self):
        print("product_manage_test1")
     
    @pytest.mark.user_manage
    @pytest.mark.product_manage
    def test_demo3(self):
        print("manage_test1")
# 执行
pytest -vs -m user_manage

if __name__ == '__main__':
	pytest.main()
    
if __name__ == '__main__':
	pytest.main(["‐vs"])

自动发现机制

自动识别测试文件与测试函数的功能,使测试过程更为高效。众多项目往往包含众多测试文件和测试函数,若需手动一一登记,无疑会耗费大量时间。

# @pytest.mark.skip(跳过原因)
# @pytest.mark.skipif(跳过条件,跳过原因)
# 示例
class TestDemo:
    
    workage2 = 5
    workage3 = 20
    
    @pytest.mark.skip(reason="无理由跳过")
    def test_demo1(self):
        print("我被跳过了")
    @pytest.mark.skipif(workage2<10,reason="工作经验少于10年跳过")    
    def test_demo2(self):
        print("由于经验不足,我被跳过了")
    
    @pytest.mark.skipif(workage3<10,reason="工作经验少于10年跳过")
    def test_demo3(self):
        print("由于经验过关,我被执行了")
        
    def test_demo3(self):
        print("我没有跳过条件,所以我被执行了")

项目里有很多测试代码文件,以前得让开发人员花好几个星期来整理测试注册信息。现在有了这个功能,大大减少了人力和时间成本。这个功能让测试过程变得更快,结果软件开发的整体周期也因此缩短了。

import unittest
class TestLogin(unittest.TestCase):
    
    # 在执行该类前所需要调用的方法
    @classmethod
    def setUpClass(cls) -> None:
    	print('------打开浏览器')
    
    # 在执行该类后所需要调用的方法
    @classmethod
    def tearDownClass(cls) -> None:
    	print('------关闭浏览器')
    
    # 每个测试方法执行之前都会先调用的方法
    def setUp(self):
    	print('输入网址......')
    
    # 每个测试方法执行之后都会调用的方法
    def tearDown(self) -> None:
    	print('关闭当前页面......')
    
    # 测试Case1
    def test_1(self):
    	print('输入正确用户名密码验证码,点击登录 1')
  
	# 测试Case2
    def test_2(self):
    	print('输入错误用户名密码验证码,点击登录 2')

配置文件的使用

Python测试框架pytest完全指南:从零基础到精通

测试框架中,配置文件扮演着关键角色。通过在.ini文件里调整属性,我们可以改变测试框架的预设设置。以开发在线教育平台为例,团队可以在项目根目录下创建一个.ini文件,以此来设定众多自定义属性。

依据项目具体要求对预设属性进行修改,以确保测试环节能够适应特定项目的多样化需求。这样做能确保项目在各类环境中测试的一致性,这对于那些需在多种环境部署测试的项目来说,显得尤为重要。

@pytest.fixture(scope="function")
	def exe_database_sql():
		print("执行SQL查询")
		yield
		print("关闭数据库连接")

前后置与自动化方面的特性

@pytest.fixture(scope="function")
	def exe_database_sql():
		print("执行SQL查询")
		yield "success"
        # return "success" 执行后无法执行后置操作
		print("关闭数据库连接")

这个框架在处理前后置关系上具有特别的作用。比如在函数的前后置部分,我们可以用yield来精确地界定。记得有一个企业级的管理系统开发项目,巧妙地运用了这一前后置特性,结果让测试案例的运行变得更加有条理和高效。

def test_2(self,exe_database_sql):
    	print(exe_database_sql)

这个参数默认是不自动启动的,为False。但若将其改为True,便能在满足项目具体需求的情况下,让固件在特定范围内自行启动。这样一来,操作变得更加简便,也让开发者节省了不少时间。

在当前的软件编程领域,你是否曾因测试工具的好坏而体验到与众不同的开发过程?期待大家的点赞与转发,同样也乐于在评论区听到你们的个人故事。

@pytest.fixture(scope="class")
	def exe_database_sql():
		print("执行SQL查询")
		yield
		print("关闭数据库连接")

@pytest.fixture(scope="session")
	def exe_database_sql():
		print("执行SQL查询")
		yield
		print("关闭数据库连接")

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

七爪网 行业资讯 Python测试框架pytest完全指南:从零基础到精通 https://www.7claw.com/2802155.html

七爪网源码交易平台

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务