行为测试的模块化结构

nnj*_*nja 1 python python-behave

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

Tests/
--BehaveTest1/
----BehaveTest1.feature
----steps/
------test_steps.py
--BehaveTest2/
----BehaveTest2.feature
----steps/
------test_steps.py
Run Code Online (Sandbox Code Playgroud)

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

import sys, os
sys.path.append('../common')
import common
Run Code Online (Sandbox Code Playgroud)

但是我不想弄乱路径,所以我想知道是否有更好的方法可以通过行为测试功能的结构来做到这一点?

Lou*_*uis 5

无需弄乱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
Run Code Online (Sandbox Code Playgroud)

存在__init__.pyTests目录是关键。它是一个空文件,但是如果没有它,Python将无法加载该模块,因为它Tests不会被视为软件包。

我可以test_steps.py在两个目录中都做:

import Tests.common
Run Code Online (Sandbox Code Playgroud)

Tests/common.py文件包含:

from behave import when, then

@when("foo")
def foo(context):
    pass

@then("bar")
def bar(context):
    pass
Run Code Online (Sandbox Code Playgroud)

@when并且@then会自动放入从steps/子目录加载的“行为”文件中,而不是从您从中加载的任何其他模块中import

然后,我可以使用伪造的特征文件来运行它,这些伪造的特征文件调用在中定义的步骤common.py

$ behave Tests/BehaveTest*
Feature: BehaveTest1 # Tests/BehaveTest1/BehaveTest1.feature:1

  Scenario: foo  # Tests/BehaveTest1/BehaveTest1.feature:3
    When foo     # Tests/common.py:3 0.000s
    Then bar     # Tests/common.py:7 0.000s

Feature: BehaveTest2 # Tests/BehaveTest2/BehaveTest2.feature:1

  Scenario: foo  # Tests/BehaveTest2/BehaveTest2.feature:3
    When foo     # Tests/common.py:3 0.000s
    Then bar     # Tests/common.py:7 0.000s

2 features passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
4 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.000s
Run Code Online (Sandbox Code Playgroud)