我使用行为来运行我们基于小黄瓜的测试套件,并使用一个自定义运行器来处理并行运行行为。
这在我的本地(Windows 8.1)机器上完美运行,并允许我使用 os.environ.update 在我的子进程中更改环境变量
这在我们的 Ubuntu 14.04 服务器上失败,并且无法更改环境变量,这与每个测试运行的数据库名称一致。我正在做的一些剥离代码如下:
def create_database(name):
#create a postgres database, this works.
return "our_test_database_%s" % name
def drop_database(name):
#drop a postgres database, also works
return name
def get_features():
return [feature for feature in os.listdir(features) if feature.endswith(".feature")
def main():
manager = multiprocessing.Manager()
databases = manager.Queue()
cpu_count = multiprocessing.cpu_count()
for i in range(cpu_count):
databases.put(create_database(str(i)))
pool = multiprocessing.Pool(processes=cpu_count, maxtaskperchild=1)
results = pool.map(run_test, (feature, databases for feature in features), chunksize=1)
while database = databases.get_nowait():
drop_database(database)
def run_test(feature, databases):
database = databases.get(block=True)
os.environ.update({
'DATABASE_URL': database
})
config = behave.configuration.Configuration(("--no-logcapture", "--tags=~@skip", "-f", "plain", feature))
runner = behave.runner.Runner(config)
failed = runner.run()
databases.put(database)
在行为内部,我们使用数据库来测试我们的 Flask 应用程序。Flask 运行时找不到设置的环境变量。
编辑:我不知道发生了什么变化,我们在服务器和我的机器上使用相同版本的 Python,以及所有已知使用过的软件包的相同版本。环境变量未正确更新,因此无法在以后的代码中访问。