现在我有以下测试功能目录:
Tests/
--BehaveTest1/
----BehaveTest1.feature
----steps/
------test_steps.py
--BehaveTest2/
----BehaveTest2.feature
----steps/
------test_steps.py
由于BehaveTest1和BehaveTest2的测试步骤很常见,我想实现一个通用模块,可以在需要时由两个测试用例调用。目前,我在Tests /文件夹中创建了一个公共/目录,并通过以下方式导入它(在每个测试功能的test_steps.py文件中):
import sys, os
sys.path.append('../common')
import common
但是我不想弄乱这条路,所以我想知道是否有更好的方法来执行行为测试功能的结构?
答案 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