Python 如何将behave集成到pytest中?

Python 如何将behave集成到pytest中?,python,bdd,pytest,python-behave,Python,Bdd,Pytest,Python Behave,我创建了一个Django应用程序,主要依靠pytest来发现和组织 我的单元和功能测试。但是,我希望在将来的测试中应用行为驱动的behave开发。不幸的是,perhave测试功能不是由pytest自动检测的 如何将behave及其测试集成到pytest发现、执行和报告中?pytest和behave是两个独立的测试运行程序 有一个用于行为测试的工具,它也使用小黄瓜作为DSL,但步骤的实现使用了与behave不同的语法,因此我认为您不能直接运行使用它创建的步骤。以下,您可以实现如下输出: _____

我创建了一个Django应用程序,主要依靠
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输出
  • 您可以通过针对整个功能或特定步骤来实现更多/更少的粒度,但此代码片段仅为场景演示
  • 由于(1),您不会收集数据,例如用于覆盖目的

  • 有一个插件可以与pytest一起使用:没有,这个插件可以做相反的事情。这个代码片段本打算用作指南,但我还是用缺少的类更新了它