用于行为测试的模块化结构

时间:2016-04-14 02:55:04

标签: python python-behave

现在我有以下测试功能目录:

Tests/
--BehaveTest1/
----BehaveTest1.feature
----steps/
------test_steps.py
--BehaveTest2/
----BehaveTest2.feature
----steps/
------test_steps.py

由于BehaveTest1和BehaveTest2的测试步骤很常见,我想实现一个通用模块,可以在需要时由两个测试用例调用。目前,我在Tests /文件夹中创建了一个公共/目录,并通过以下方式导入它(在每个测试功能的te​​st_steps.py文件中):

import sys, os
sys.path.append('../common')
import common

但是我不想弄乱这条路,所以我想知道是否有更好的方法来执行行为测试功能的结构?

4 个答案:

答案 0 :(得分:3)

没有必要弄乱sys.path,这不依赖于您使用的Python版本。这与Python 2.7或Python 3.x一样适用。

给定以下文件结构:

Tests/
├── BehaveTest1
│   ├── BehaveTest1.feature
│   └── steps
│       └── test_steps.py
├── BehaveTest2
│   ├── BehaveTest2.feature
│   └── steps
│       └── test_steps.py
├── common.py
├── __init__.py

__init__.py目录中Tests的存在是关键。这是一个空文件,但没有它,Python将无法加载模块,因为{{1不被认为是一个包。

我可以在两个目录中都有Tests

test_steps.py

import Tests.common 文件包含:

Tests/common.py

from behave import when, then @when("foo") def foo(context): pass @then("bar") def bar(context): pass @when会自动放入从@then子目录中加载的文件,但不会加载到您使用steps/加载的任何其他模块中。

然后我可以使用伪造的特征文件运行它,这些伪造的文件调用import

中定义的步骤
common.py

答案 1 :(得分:0)

实际上没有其他方式像你这样做:

您想从某个位置导入代码。这意味着你需要让python知道这个位置。这是通过PYTHONPATH或sys.path.append()完成的。

行为(据我所知)只能在功能文件所在的“steps”目录中找到代码。如果您有其他代码,则必须设置sys.path。

在python中> 3.3它可以更简单,因为“命名空间”包(pep420)可以调用

 :$ behave Tests/BehaveTest1/BehaveTest1.feature

在Tests目录的父文件夹中。然后你必须做

import Tests.common
在步骤文件中

这是因为Tests,BehaveTests1和BehaveTests2将成为python包。

答案 2 :(得分:0)

可能有这样的结构,如果我运行以下命令,则将运行alice.features和bob.features中的步骤:“ behave”或“ behave --tags @”

DIRECTORY STRUCTURE:
+-- features/
     +-- steps/   (optional, common steps)
        +-- alice.features/
         |     +-- steps/   (specific steps for alice sub features, can use common steps)
         |     +-- *.feature
        +-- bob.features/
             +-- steps/
             +-- *.feature
      +-- environment.py

答案 3 :(得分:-2)

最灵活的方法是在我的步骤文件夹中创建我的类的文件夹:

features/test.feature
test_steps/
test_steps/classes
test_environment.py