什么是网站风格微信小程序开发教程模板

张小明 2026/1/3 21:07:03
什么是网站风格,微信小程序开发教程模板,南通网站建设公司排名,电脑做系统ppt下载网站好先利其器 虚拟环境与pytest配置 首先你需要准备好pycharm#xff0c;并且安装好python环境。#xff08;mac基本都自带python#xff0c;3.7.8及其以后的版本都可用#xff09;。然后按照以下步骤#xff0c;配置好虚拟环境。 本文档是教程#xff0c;不会涉及到具体的…先利其器虚拟环境与pytest配置首先你需要准备好pycharm并且安装好python环境。mac基本都自带python3.7.8及其以后的版本都可用。然后按照以下步骤配置好虚拟环境。本文档是教程不会涉及到具体的业务逻辑与代码。但是可能部分知识建议你配合本地调试来理解。因此建议建立一个学习项目比如我的学习项目叫MyXXX比如MyPython。在开始下面的内容前您只需要建好一个文件夹然后用pycharm打开它就好了。本文不涉及python3的语法除非是一些高级特性对使用pytest有帮助的不过python语法很简单照着写也能写如果想系统学习我推荐这个教程www.liaoxuefeng.com/wiki/101695…此时这个虚拟环境就创建好了我们可以看到根目录下多了一个橙红色的venv文件夹。golang会把所有的包都下载到同一个目录然后使用包名版本唯一指定一个包并在编译时读取go.mod获取对应的包版本。而python不同python的包的目录下一个包只会有一个文件夹不会有多版本共存的情况。因此虚拟环境就是帮你创建好一个仅有这个项目可用的下载第三方包的文件夹。然后我们再创建一个requirements.txt文件一个pytest.ini文件requirements.txt这个文件类似golang的go.mod文件用来指定依赖与版本的。不过requirements.txt是一个给人看的文件python在运行时不会检查requirements.txt。allure-pytest2.8.6 allure-python-commons2.8.6 pytest6.2.3 pytest-assume2.2.1 pytest-cov2.8.1 pytest-cover3.0.0 pytest-coverage0.0 pytest-dependency0.5.1 pytest-forked1.4.0 pytest-pythonpath0.7.4 pytest-ordering0.6 pytest-repeat0.9.1 pytest-rerunfailures11.0 pytest-xdist1.30.0 python-dateutil2.8.2 retry0.9.2 retrying1.3.4这个是pytest的运行配置文件。pytest会在运行目录中自动找到文件并读取配置。这里面预设了一些配置能省去我们之后在命令行里敲配置。[pytest] markers p0: 优先级标 marks tests as p0 p1: 优先级标 marks tests as p1 p2: 优先级标 marks tests as p2 python_paths . addopts -v -s --alluredirreports/ecs --junit-xmlreports/result.xml --import-modeimportlib python_classes Test* python_files test* python_functions test* # 这里配置一下之后在allure的界面上可以看到格式化之后的日志 log_cli True log_level INFO log_format %(asctime)s.%(msecs)03d[%(levelname)s]%(pathname)s:%(funcName)s:%(lineno)d: %(message)s log_date_format %Y-%m-%d %H:%M:%S # 虽然pytest自己就可以设置日志相关参数但是有个大问题在启用pytest-xdist之后日志无法输出到控制台 # 这是相关的issuehttps://github.com/pytest-dev/pytest-xdist/issues/574 # 因此我们不得不设置两遍 # 1. 在pytest侧设置一遍用于格式化allure中的日志 # 2. 自己用logger.conf来设置一遍loggerAI写代码bash最后两步我们安装一下依赖并检查一下目前根目录下应该有这些东西如图左打开pycharm自带的命令行工具并运行pip3 install -r requirements.txt如图右接着在命令行里输入pytest --version确认一下pytest是否安装完成pycharm的配置打开preferences按如下设置然后重启打开这个项目如果你之前已经有了一些运行配置则需要把他们先全删掉第一个测试我们创建一个test_my_heart.py文件编辑这些内容import logging def my_heart_status(): return bad def test_my_heart(): 测试一下我的心脏是否在跳动 logging.info(即将检查我的心脏) assert my_heart_status() healthyAI写代码bash12345678910111213在命令行中输入pytest得到这些输出是不是神奇又很简单我猜你可能有这些疑问pytest怎么知道哪些函数是测试这里pytest在目录下递归寻找测试函数并运行。查找的规则如下寻找以test开头或结尾的py文件在第一步中找到的文件中寻找以Test开头的类并且没有__init__方法可省略在第一步中找到的文件中寻找以test_开头的函数或者在第二步中找到的类中寻找以test开头的方法。assert是什么assert是断言简而言之assert后面跟一个表达式并且这个表达式返回bool值。如果bool值是True则测试通过如果是False则测试失败。注意在pytest中写测试的时候一定要使用assert去做测试结果的断言而不要主动抛出错误比如raise error。pytest mock了assert的实现因此可以捕捉到用例的失败以及失败时的上下文。注意看下图中pytest主动输出的上下文如果主动raise error则不会有这么清晰的上下文输出。优雅使用assertimport logging def my_heart_status(): return bad def test_my_heart(): 测试一下我的心脏是否在跳动 logging.info(即将检查我的心脏) assert my_heart_status() healthy, f检查我的心脏失败实际结果为{my_heart_status()}AI写代码bash12345678910111213报错信息对比生成测试报告可以注意到刚刚运行完之后在根目录多了一个reports文件夹。这个文件夹存放了测试结果但是这个测试结果不是人类可读的因此我们需要生成一个人类可读的测试报告。虽然命令行的输出也能看但是生成的测试报告实在太方便了因此我强烈建议用网页版的测试报告来查看测试结果。我们首先安装一下allurebrew install allure。然后运行allure generate reports/ecs -o reports/html --clean。我们就生成了人类可读的html测试报告。然后打开这个html如图左并把语言转成中文如图右如果想了解更多关于allure的细节可以自己摸索与参考这个连接~qualitysphere.gitee.io/ext/allure/…类别、测试套、功能、包这四个title都可以查看到所有的测试用例执行情况。但是我最推荐**“功能”**来查看因为这个title展示起来最清晰需要点击的次数最少。下面是在面对几十个测试用例下几个tab页的区别。查看失败的原因回到我们自己的例子上我们点击功能点击我们刚刚失败的case如左图我们可以看到是哪个case失败了。更进一步我们点开几个框框可以看到具体的日志和测试详情。Markdocs.pytest.org/en/7.1.x/ho…打标签使用pytest的mark能力我们可以给case打tag然后按tag来运行不同的case。比如最基础的区分P0与P1 case。我们来修改一下之前的代码import logging import pytest def my_heart_status(): return stopped def my_heartbeat(): return -1 pytest.mark.p0 def test_my_heart_status(): 测试一下我的心脏是否在跳动 logging.info(即将检查我的心脏) assert my_heart_status() running pytest.mark.p1 def test_my_heartbeat(): 测试一下我的心脏跳动是否正常 logging.info(即将检查我的心脏) assert 50 my_heartbeat() 180然后我们运行pytest -m p0会得到如右图的结果可以看到pytest把两个用例都识别出来了但是只跑了标记了p0的用例而标记了p1的用例没有跑此外所有的mark需要提前声明。在这个case中我们在【先利其器】中创建的pytest.ini文件中已经提前声明好了一些mark如图左如果没有提前声明那么pytest会有报警如图右暂时不运行如果某个用例暂时有问题或者用例写好了但是功能没写好我们可以标记先跳过这个用例如图左更进一步我们可以有条件得跳过某些case比如我们先看看当前的环境是否在ICU如果在的话就不管心跳了。同一个用例不同的参数比如现在有一个查询的测试接口我们要测试不同查询条件下接口是否符合预期。从最简单的开始不同的page size可以看到虽然我们只写了一个用例但是利用pytest.mark.parametrize我们实现了类似表驱动测试的效果。下面使用了pytest -k参数。使用细节可以参考FQA-如何只跑一个测试我们也可以在一个pytest.mark.parametrize内设置多个参数我们还可以让多个参数排列组合只需要添加多个pytest.mark.parametrize即可Fixture前置依赖fixture中文名叫做夹具是pytest最重要的一块功能pytest可以通过fixture来指定前置依赖并且pytest将解析依赖顺序然后按照顺序一个一个函数执行。如果前置依赖执行失败了那么后续的操作就自动不会执行。以上是fixture的特点。而我们使用fixture主要看中其三个功能声明前置依赖可以在测试报告里看到而不用看代码了。缓存同一作用域下的前置依赖并让多个用例共用一个前置依赖通过复用资源提高运行速度减少资源占用。在case运行完之后清理资源。方便~先来一个简单的例子我们把之前主动调用的my_heart_status与my_heartbeat改成前置依赖。代码如下import logging import pytest pytest.fixture() def my_heart_status(): return running pytest.fixture() def my_heartbeat(): return 80 pytest.mark.p0 def test_my_heart_status(my_heart_status): 测试一下我的心脏是否在跳动 logging.info(即将检查我的心脏) assert my_heart_status running pytest.mark.p1 def test_my_heartbeat(my_heartbeat): 测试一下我的心脏跳动是否正常 logging.info(即将检查我的心脏) assert 50 my_heartbeat 180解释一下上述代码通过给函数加上pytest.fixture这个装饰器pytest可以收集到所有的fixture。然后pytest会分析每个测试用例的入参按命名找到对应的fixture执行fixture并把fixture的结果传给测试用例。同时在我们使用了fixture之后在测试报告中也能看到测试用例的前置依赖。如果前置依赖失败而导致用例失败也能在测试中清晰看到conftest刚刚我们把测试用例与fixture写在同一个py文件内那么这些fixture只能在这个py文件内使用。如果要让fixture能被多个py文件使用则需要把fixture写到conftest.py文件中。pytest会递归寻找目录下名为conftest.py的文件并使这些fixture在其子目录都可用。举个例子共有三层目录两个conftest.py文件三个test.py文件。- conftest.py # 有fixtureA - test_x.py - TestOtherDir # 这是一个文件夹 - conftest.py. # 有fixtureB - test_y.py - TestZDir # 这是一个文件夹 - test_z.py上面的例子中fixtureA可以被三个test.py文件使用。fixtureB只能被test_y.py、test_z.py使用。让我们新建一个conftest.py文件并把两个fixture都放进入。作用域 缓存与共用fixturefixture的一个大用途在于在同一作用域下多个case共享同一个前置依赖。我们将上述的例子改一下假设通过一个方法就可以获得heart的所有信息。# 在 conftest.py中 import logging import pytest class Heart: def __init__(self, status, beat): self.status status self.beat beat pytest.fixture() def my_heart(): logging.info(获取heart信息) return Heart(running, 80) # 在 test_heart.py中 pytest.mark.p0 def test_my_heart_status(my_heart): 测试一下我的心脏是否在跳动 logging.info(检查心脏状态) assert my_heart.status running pytest.mark.p1 def test_my_heartbeat(my_heart): 测试一下我的心脏跳动是否正常 logging.info(检查心跳) assert 50 my_heart.beat 180然后如下图my_heart函数调用了两次。这是因为每个fixture默认的作用域是function级别的即每个测试用例都会重新执行一遍这个fixture。作用域一共有四种function每个测试用例都运行一次该fixture默认classclass内所有方法只运行一次该fixture一个类内可以有多个测试方法)module一个.py文件只执行一次该fixturesession每次调用pytest命令下只执行一次跨多个py文件多个文件夹我们将其作用域改为module然后看看执行结果。可以看到这个fixture只会执行一次。如果我们将两个测试用例放在两个py文件下则又会执行两次。如果我们将两个测试用例放在两个py文件下但是作用域设置成session则只会执行一次。更多的例子可以参考这个文档blog.csdn.net/Tangerine02…嵌套除了case可以通过fixture设置前置依赖fixture本身也可以设置前置依赖~# 在 conftest.py中 import logging import pytest class Heart: def __init__(self, status, beat): self.status status self.beat beat pytest.fixture() def prepare(): return abc pytest.fixture() def my_heart(prepare): logging.info(获取heart信息 prepare) return Heart(running, 80)可传参Fixture我们可以通过把函数调用转为fixture依赖来获得更加直观的测试报告与前置依赖缓存。但是在函数调用时可以传递参数那我们怎么给fixture传递参数呢接着上面的例子我们需要检查不同年龄、不同性别的心脏在fixture中需要将第一个参数设置为request然后可以通过request.param拿到测试用例传来的所有参数。在测试用例中用法基本pytest.mark.parametrize相同只需要添加indirectTrue即可。# 在 conftest.py 中 import pytest class Heart: def __init__(self, status, sex, beat): self.status status self.sex sex self.beat beat pytest.fixture(scopemodule) def my_heart(request): logging.info(获取heart信息) return Heart(running, request.param[sex], request.param[age] * 5) # 在 test_my_heart.py 中 import logging import pytest pytest.mark.parametrize(my_heart, [{sex: female, age: 13}, {sex: male, age: 15}], indirectTrue) # 注意这里 def test_my_heartbeat(my_heart): 测试一下我的心脏跳动是否正常 logging.info(检查心跳) assert 50 my_heart.beat 180可传参Fixture的作用域前文提到在同一作用域下的fixture只会被执行一次。那如果我们给fixture传递了不同的参数参数作用域会发生什么样的变化呢接着上面的例子conftest.py的代码不变我们修改test_my_heart.py的代码import logging import pytest user1 {sex: male, age: 15} user2 {sex: female, age: 13} pytest.mark.parametrize(my_heart, [user1], indirectTrue) def test_my_heart_status(my_heart): 测试一下我的心脏是否在跳动 logging.info(检查心脏状态) assert my_heart.status running pytest.mark.parametrize(my_heart, [user2], indirectTrue) def test_my_heartbeat(my_heart): 测试一下我的心脏跳动是否正常 logging.info(检查心跳) assert 50 my_heart.beat 180这样运行一遍我们会发现fixture会执行两次。而如果我们把user2改成user1则只会运行一遍。因此我们可以得出结论对于可传参的fixture参数fixture共同构成唯一一个前置依赖。有个小问题Python如何判断两个值是否相等呢对于Python而言判断两个值相等有两个操作符 和is。用来判断值是否相等is用来判断地址是否相等。对Pytest的fixture而言其使用is来判断是否相等。因此两个相同的dict也会让fixture执行两遍只有声明一个全局变量然后两者都使用这个全局变量才会让fixture只执行一遍。更多关于Python 和 is的区别可以参考这个讨论www.zhihu.com/question/20…虽然pytest.mark.parametrize可以设置scope作用域并且可以覆盖原有fixture的作用域。但是并不推荐这么做因此这里不展开。资源清理比如我们想观测Heart得先连接一个监听器到Heart上在我们测试结束之后再把监听器给卸载掉。首推的做法是使用yield这个写法更加简单清晰pytest.fixture(scopemodule) def my_heart(request): logging.info(连接监听器) logging.info(获取heart信息) yield Heart(running, request.param[sex], request.param[age] * 5) logging.info(卸载监听器)其次推荐的是使用fixture的request参数request.addfinalizer()。我们来修改一下之前的my_heart fixture。pytest.fixture(scopemodule) def my_heart(request): logging.info(连接监听器) def teardown(): # 这个函数的名字是随意的也可以叫别的 logging.info(卸载监听器) request.addfinalizer(teardown) # 这一行注册一个fixture生命周期结束后运行的函数 logging.info(获取heart信息) return Heart(running, request.param[sex], request.param[age] * 5)11有两个点需要注意第一是两种方式存在细微的逻辑差别当下图中红色框框内的代码段报错时raise error使用addfinalizer会执行teardown的逻辑前提是addfinalizer先于报错代码段运行而使用yield则不会。第二是要注意写teardown的时候要考虑红色框框内失败的情况。举一个例子有一个创建资源的fixture并且内置删除资源的teardown逻辑。当创建资源失败时teardown去删除资源可能会报错NotFound此时不应该raise error。执行顺序与清理顺序首先需要注意的是由于并发跑测试、每次跑的测试集不同pytest跑用例的顺序总是没有规律的。因此case与case之间最好不要有任何的顺序依赖关系。如果case之间依赖相同的fixture最好在每次执行完之后把这个fixture还原到最开始的状态。其次fixture自身的执行顺序和清理顺序是有迹可循的其按照以下顺序以此执行。首先执行autouseTrue的fixture其次执行某个case依赖的fixture如果一个case依赖多个fixture则按顺序从左到右依次执行。其次执行fixture依赖的fixture如果一个fixture依赖多个fixture则按顺序从左到右依次执行并按DFS深度优先递归解析依赖。而对于清理操作则会按上述顺序反着来即最先被执行的fixture最后被清理。我们新起一个py文件来看看左侧展示了DFS的规则右侧展示autouse的影响。对于这个case大家可以自行修改代码并执行体会一下依赖关系。# test_order.py import pytest pytest.fixture() def a(): print(准备AAA) yield a print(清理AAA) pytest.fixture() def b(): print(准备BBB) yield b print(清理BBB) pytest.fixture() def c(a, b): print(准备CCC) yield c print(清理CCC) def test_order_1(c): pass 准备AAA 准备BBB 准备CCC PASSED 清理CCC 清理BBB 清理AAA # test_order.py import pytest pytest.fixture() def a(): print(准备AAA) yield a print(清理AAA) pytest.fixture(autouseTrue) def b(): print(准备BBB) yield b print(清理BBB) pytest.fixture() def c(a, b): print(准备CCC) yield c print(清理CCC) def test_order_1(c): pass 准备BBB 准备AAA 准备CCC PASSED 清理CCC 清理AAA 清理BBBFAQ如何只跑一个测试有三种方式一种是直接点击pycharm的这个箭头就可以。如果点击后有些问题请参考【先利其器】一章节的内容设置一下pycharm一种是直接在命令行中调用pytest -k XXXXXX是你的测试函数或者测试类。如果你的测试函数名与其他地方的测试函数名重合则可以加上路径比如pytest FFF -k XXX。其中FFF是你所要运行的用例的路径精确到文件夹或者文件都可以。一种是不使用-k直接pytest XXXXXX的格式可以参考下图某个fixture找不到python的函数很容易被同名的变量、或者其他函数覆盖。有一个很诡异的例子# 在 conftest.py 中 from a_fixture import * from a import * # 在 a_fixture.py 中 pytest.fixture def aaa(): pass # 在 a.py 中 aaa None在上述例子中运行pytest --fixtures是找不到aaa这个fixture的。但是如果把两个import的顺序替换一下就又能看到了。只运行上次失败的case在运行完之后运行结果会保存在reports目录下。我们可以运行pytest --lf来只运行上次失败的case。allure的报告很混乱因为每次运行的结果都会保存在reports目录下所以reports的东西会越来越多让allure生成的报告也越来越复杂。因此过一段时间可以把reports目录全部删掉这样报告就清晰了。单个case下的日志文件是按什么规则收集的通常而言一个case执行了什么包括前置依赖、自身的逻辑、资源清理的日志都会在一个case的日志中。但是如果多个case依赖了同一个fixture那么这个fixture的创建日志只会出现在其第一次被执行的case的日志中后续的case就没有这部分日志了。allure报告中的黄颜色的item是什么意思意思是代码发生了panicraise error。通常是代码没有做错误处理导致的。pytest 多线程插件 pytest-parallel 不能和测试报告插件 allure-pytest兼容的问题版本pytest-multithreading-allure-1.0.5使用requirement.txt解决办法testerhome.com/topics/3274…相关问题github.com/allure-fram…参考文档docs.pytest.org/en/7.1.x/in…blog.csdn.net/tangerine02…blog.csdn.net/totorobig/a…qualitysphere.gitee.io/ext/allure/总结感谢每一个认真阅读我文章的人作为一位过来人也是希望大家少走一些弯路如果你不想再体验一次学习时找不到资料没人解答问题坚持几天便放弃的感受的话在这里我给大家分享一些自动化测试的学习资源希望能给你前进的路上带来帮助。软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。视频文档获取方式这份文档和视频资料对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你以上均可以分享点下方小卡片即可自行领取。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建旅游网站的意义h5个人网页设计心得

终极指南:用PlotNeuralNet快速生成专业级神经网络示意图 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 你是否曾为论文中的神经网络图表而头疼?手…

张小明 2026/1/1 14:11:47 网站建设

做企业网站需要哪些阻止网站查到访问者ip

Elsevier投稿状态实时监控:3分钟搞定学术稿件追踪难题 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为反复登录Elsevier投稿系统而烦恼吗?每次手动刷新页面查看审稿状态,不…

张小明 2026/1/1 14:51:48 网站建设

官网设计比较好看的网站网站建设牜金手指花总十五

Spring Web应用中的多种视图技术 在Spring Web应用开发中,选择合适的视图技术对于实现高效、可维护的应用至关重要。本文将详细介绍几种常见的视图技术,包括JSP、Velocity、FreeMarker、XSLT和PDF视图,并提供使用示例和相关注意事项。 1. 显示字段错误信息 在Spring中,如…

张小明 2026/1/1 15:41:21 网站建设

同一个地方做几个网站广州交易中心官网

PHP2Go:从PHP到Go的无缝迁移终极方案 【免费下载链接】php2go Use Golang to implement PHPs common built-in functions. 项目地址: https://gitcode.com/gh_mirrors/ph/php2go 痛点:PHP开发者的转型困境 在当今追求高性能和高并发的技术环境下…

张小明 2026/1/1 16:43:24 网站建设

网站建设考虑事项番禺人才网车床工铣床工招聘

Wan2.2-T2V-5B能否生成气泡上升?密度差驱动运动建模分析 在短视频内容爆炸式增长的今天,你有没有想过——一个AI模型能不能“理解”物理世界?比如,当你说“请生成一个气泡从水底缓缓上升的视频”,它真的能模拟出那种因…

张小明 2026/1/1 16:01:11 网站建设

重庆自适应网站建设wordpress主题需要ftp

LangFlow流式输出控制:逐字返回还是整段显示? 在构建AI对话系统时,你有没有遇到过这样的体验:点击“发送”后界面一片空白,几秒钟毫无动静,正当你以为程序卡死、准备刷新页面时,答案突然“砰”地…

张小明 2026/1/1 12:22:45 网站建设