我可以将步骤定义放在一个不是“步骤”的文件夹中吗?

时间:2018-03-09 09:16:52

标签: python bdd python-behave

我正在尝试使用Behave on Python。 我想知道是否有办法将我的.py文件放在其他地方,而不是被迫将它们全部放在“steps”文件夹中。我目前的结构看起来像这样

tests/
    features/
    steps/ #all code inside here, for now

我想要完成的事情就像是

tests/
    features/ #with all the .feature files
    login/ #with all the .py files for logging in inside a service
    models/ #with all the .py files that represents a given object
    and so on

我在Behave之前使用的唯一BDD框架是Cucumber with Java,它允许在我想要的任何地方插入步骤定义(其余部分由Cucumber本身处理)。 我问这个是因为我想在我的项目中有很多课程,以便以更好的方式组织我的代码。

2 个答案:

答案 0 :(得分:1)

首先,从行为文档(版本1.2.7.dev0):

  

表现适用于三种类型的文件:

     
      
  1. 您的业务分析师/赞助商/其中包含您的行为方案的人员编写的功能文件,以及
  2.   
  3. 一个“steps”目录,其中包含方案的Python步骤实现。
  4.   
  5. 可选择一些环境控制(在步骤,场景,功能或整体之前和之后运行的代码   射击比赛)。
  6.   

因此需要steps/目录。

为了完成类似于您的想法的解决方法,我尝试在/steps目录中创建一个子目录:/steps/deeper/并在那里插入我的Python文件:/steps/deeper/testing.py。运行后,我收到了" NotImplementedError",表示找不到/deeper/testing.py中的步骤定义。

对于任何其他Python文件,似乎行为不会通过steps/目录的子目录递归搜索。

至于你想要做什么,我认为这是一个不错的组织理念,但由于它不可行,你可以这样做:而不是拥有目录对于tests/目录中的Python文件,为什么没有Python文件的良好命名约定并将相关的函数分离到自己的Python文件中?那就是:

tests/
    features/
    steps/
        login_prompt.py # contains all the functions for logging in inside a service
        login_ssh.py # contains all the functions for SSH login
        models_default.py # contains all the functions for the default object
        models_custom.py # contains all the functions for a custom object
        and so on...

当然,在这一点上,将它们分成不同的Python文件并不重要,因为在调用steps/时,行为会搜索所有Python文件,但对于组织来说却是如此。它的缘故,它完成了同样的效果。

答案 1 :(得分:1)

这可能有点晚了,但是您可以执行以下操作:

具有这样的结构:

tests/
    features/
        steps/
            login
            main_menu
            all_steps.py

在步骤的子文件夹中,您可以使用实现创建_steps.py文件,然后在all_steps.py(或命名方式)中,只需导入它们即可:

from tests.steps.login.<feature>_step import *
from tests.steps.main_menu.<feature>_step import *
etc

当您运行它时,它应该找到步骤文件。另外,您可以在项目中的任何位置保存文件,只要您拥有1 Steps文件夹,并且在导入所有步骤时文件中都有一个文件