当我试图解释我的困境时,请耐心等待,我仍然是 Python 新手,所以我的术语可能不正确。另外,我很抱歉这篇文章不可避免的冗长,但我会尝试尽可能详细地解释相关细节。
简要介绍:
我目前正在使用 py.test 为一组功能基本相同的网站开发一套 Selenium 测试
使用 pytest 插件pytest-testrail将测试结果上传到 TestRail 。
测试使用带有唯一案例 ID 的装饰器 @pytestrail.case(id) 进行标记
我的一个典型测试如下所示:
@pytestrail.case('C100123') # associates the function with the relevant TR case
@pytest.mark.usefixtures()
def test_login():
# test code goes here
正如我之前提到的,我的目标是创建一组代码来处理我们具有(几乎)相同功能的许多网站,因此上面示例中的硬编码装饰器将不起作用。
我尝试了一种数据驱动方法,其中包含 csv 和 TestRail 中的测试列表及其案例 ID。
例子:
website1.csv:
Case ID | Test name
C100123 | test_login
website2.csv:
Case ID | Test name
C222123 | test_login
我编写的代码将使用检查模块来查找正在运行的测试的名称,找到相关的测试 ID 并将其放入名为 test_id 的变量中:
import csv
import inspect
class trp(object):
def __init__(self):
pass
with open(testcsv) as f: # testcsv could be website1.csv or website2.csv
reader = csv.reader(f)
next(reader) # skip header
tests = [r for r in reader]
def gettestcase(self):
self.current_test = inspect.stack()[3][3]
for row in trp.tests:
if self.current_test == row[2]:
self.test_id = (row[0])
print(self.test_id)
return self.test_id, self.current_test
def gettestid(self):
self.gettestcase()
这个想法是装饰器会根据我当时使用的 csv 动态变化。
@pytestrail.case(test_id) # now a variable
@pytest.mark.usefixtures()
def test_login():
trp.gettestid()
# test code goes here
因此,如果我为 website1 运行test_login,装饰器将如下所示:
@pytestrail.case('C100123')
如果我为 website2 运行test_login,装饰器将是:
@pytestrail.case('C222123')
我为自己提出这个解决方案感到非常自豪并尝试了它......它没有用。虽然代码本身可以工作,但我会得到一个异常,因为 test_id 是未定义的(我理解为什么 -gettestcase
在装饰器之后执行,所以它当然会崩溃。
我可以处理的唯一其他方法是在执行任何测试代码之前应用 csv 和 testID。我的问题是 - 我怎么知道如何将测试与他们的测试 ID 相关联?一个优雅的、最小的解决方案是什么?
很抱歉这个冗长的问题。如果您需要更多解释,我将密切关注以回答任何问题。