У меня были проблемы с очень специфическим стилем параметризованных тестов. Все наши тесты Selenium могут выполняться локально, но они также должны иметь возможность удаленного запуска на нескольких платформах SauceLabs. По сути, я хотел взять большое количество уже написанных тестовых случаев и параметризовать их с наименьшим количеством возможных изменений в коде. Кроме того, мне нужно было иметь возможность передавать параметры в метод setUp, чего я не видел в других решениях.
Вот что я придумала:
import inspect
import types
test_platforms = [
{'browserName': "internet explorer", 'platform': "Windows 7", 'version': "10.0"},
{'browserName': "internet explorer", 'platform': "Windows 7", 'version': "11.0"},
{'browserName': "firefox", 'platform': "Linux", 'version': "43.0"},
]
def sauce_labs():
def wrapper(cls):
return test_on_platforms(cls)
return wrapper
def test_on_platforms(base_class):
for name, function in inspect.getmembers(base_class, inspect.isfunction):
if name.startswith('test_'):
for platform in test_platforms:
new_name = '_'.join(list([name, ''.join(platform['browserName'].title().split()), platform['version']]))
new_function = types.FunctionType(function.__code__, function.__globals__, new_name,
function.__defaults__, function.__closure__)
setattr(new_function, 'platform', platform)
setattr(base_class, new_name, new_function)
delattr(base_class, name)
return base_class
При этом все, что мне нужно было сделать, это добавить простой декоратор @sauce_labs () к каждому обычному старому TestCase, и теперь при их запуске они упаковываются и переписываются, так что все методы тестирования параметризуются и переименовываются. , LoginTests.test_login (self) запускается как LoginTests.test_login_internet_explorer_10.0 (self), LoginTests.test_login_internet_explorer_11.0 (self) и LoginTests.test_login_firefox_43.0 (self), и у каждого из них есть свой собственный параметр. Платформа для запуска, даже в LoginTests.setUp, что крайне важно для моей задачи, поскольку именно здесь инициализируется соединение с SauceLabs.
В любом случае, я надеюсь, что это может помочь кому-то, кто хочет сделать аналогичную «глобальную» параметризацию своих тестов!