Python 如何将behave集成到pytest中?
我创建了一个Django应用程序,主要依靠Python 如何将behave集成到pytest中?,python,bdd,pytest,python-behave,Python,Bdd,Pytest,Python Behave,我创建了一个Django应用程序,主要依靠pytest来发现和组织 我的单元和功能测试。但是,我希望在将来的测试中应用行为驱动的behave开发。不幸的是,perhave测试功能不是由pytest自动检测的 如何将behave及其测试集成到pytest发现、执行和报告中?pytest和behave是两个独立的测试运行程序 有一个用于行为测试的工具,它也使用小黄瓜作为DSL,但步骤的实现使用了与behave不同的语法,因此我认为您不能直接运行使用它创建的步骤。以下,您可以实现如下输出: _____
pytest
来发现和组织
我的单元和功能测试。但是,我希望在将来的测试中应用行为驱动的behave
开发。不幸的是,perhave
测试功能不是由pytest
自动检测的
如何将
behave
及其测试集成到pytest
发现、执行和报告中?pytest和behave是两个独立的测试运行程序
有一个用于行为测试的工具,它也使用小黄瓜作为DSL,但步骤的实现使用了与behave不同的语法,因此我认为您不能直接运行使用它创建的步骤。以下,您可以实现如下输出:
______________________________________________________________ Feature: Fight or flight - Scenario: Stronger opponent ______________________________________________________________
Feature: Fight or flight
Scenario: Stronger opponent
Step [OK]: the ninja has a third level black-belt
Step [ERR]: attacked by Chuck Norris
Traceback (most recent call last):
File ".venv/lib/python3.6/site-packages/behave/model.py", line 1329, in run
match.run(runner.context)
File ".venv/lib/python3.6/site-packages/behave/matchers.py", line 98, in run
self.func(context, *args, **kwargs)
File "tests/bdd/steps/tutorial.py", line 23, in step_impl4
raise NotImplementedError('STEP: When attacked by Chuck Norris')
NotImplementedError: STEP: When attacked by Chuck Norris
Step [NOT REACHED]: the ninja should run for his life
使用来自的要素文件
为了使pytest运行正常,可以在conftest.py
中使用以下代码段:
#conftest.py的内容
导入pytest
类BehaveException(异常):
“”“错误报告的自定义异常。”“”
def pytest_collect_文件(父级,路径):
“”“允许为bdd分析.feature文件。”“”
如果path.ext==“.feature”:
返回BehaveFile.from_parent(parent,fspath=path)
类BehaveFile(pytest.File):
def收集(自身):
从behave.parser导入parse_文件
feature=parse_文件(self.fspath)
对于feature.walk\u场景中的场景(其中\u outlines=True):
从父对象生成BehaveFeature(
自己
name=scenario.name,
特征=特征,
情景=情景,
)
类BehaveFeature(pytest.Item):
定义初始化(自身、名称、父项、功能、场景):
super().\uuuuu init\uuuuuuu(名称,父级)
自身特征=特征
自我。情景=情景
def运行测试(自我):
将子进程作为sp导入
从shlex导入拆分
feature\u name=self.\u feature.filename
cmd=split(f“”)行为测试/bdd/
--格式json
--没有摘要
--包括{feature_name}
-n“{self.\u scenario.name}”
""")
尝试:
proc=sp.run(cmd,stdout=sp.PIPE)
如果不是proc.returncode:
返回
除作为exc的例外情况外:
引发BehaveException(self,f“exc={exc},feature={feature_name}”)
标准输出=过程标准输出解码(“utf8”)
引发行为异常(自我、标准输出)
def报告失败(自我、激励信息):
“”“当self.runtest()引发异常时调用。”“”
导入json
如果isinstance(exinfo.value,BehaveException):
feature=exinfo.value.args[0]。\u feature
结果=exinfo.value.args[1]
data=json.load(结果)
summary=“”
对于数据中的要素:
如果功能[“状态”]!=“失败”:
持续
summary+=f“\n特征:{feature['name']}”
对于要素[“要素”]中的要素:
如果元素['status']!=“失败”:
持续
summary+=f“\n{element['type'].title()}:{element['name']}”
对于元素[“步骤”]中的步骤:
尝试:
结果=步骤['result']
除KeyError外:
summary+=f“\n步骤[未到达]:{Step['name']}”
持续
状态=结果['status']
如果是状态!=“失败”:
summary+=f“\n步骤[OK]:{Step['name']}”
其他:
summary+=f“\n步骤[ERR]:{Step['name']}”
摘要+=“\n”+“\n”。加入(结果['error\u message'])
返回摘要
def报告信息(自我):
返回self.fspath,0,f“Feature:{self.\u Feature.name}-场景:{self.\u Scenario.name}”
注:
功能
、元素
、或步骤
状态与行为中的枚举
进行比较。模型核心状态
作为子例程,而不是其内部API。适当的考虑会考虑
子类化behave.runner:runner
,behave.runner:ModelRunner
并从同一进程中触发
在repr_失败中使用behave格式化程序,而不是手动解码json输出
有一个插件可以与pytest一起使用:没有,这个插件可以做相反的事情。这个代码片段本打算用作指南,但我还是用缺少的类更新了它