Ich hatte Probleme mit einem ganz bestimmten Stil parametrisierter Tests. Alle unsere Selenium-Tests können lokal ausgeführt werden, sie sollten jedoch auch remote auf mehreren Plattformen in SauceLabs ausgeführt werden können. Grundsätzlich wollte ich eine große Anzahl bereits geschriebener Testfälle mit möglichst wenigen Codeänderungen parametrisieren. Außerdem musste ich in der Lage sein, die Parameter an die setUp-Methode zu übergeben, für die ich anderswo keine Lösungen gesehen habe.
Folgendes habe ich mir ausgedacht:
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
Alles, was ich tun musste, war, jedem normalen alten TestCase einen einfachen Dekorator @sauce_labs () hinzuzufügen, und jetzt, wenn sie ausgeführt werden, werden sie verpackt und neu geschrieben, sodass alle Testmethoden parametrisiert und umbenannt werden. LoginTests.test_login (self) wird ausgeführt als LoginTests.test_login_internet_explorer_10.0 (self), LoginTests.test_login_internet_explorer_11.0 (self) und LoginTests.test_login_firefox_43.0 (self), und jeder hat den Parameter self.platform zu entscheiden Plattform, auf der auch in LoginTests.setUp ausgeführt werden kann, was für meine Aufgabe von entscheidender Bedeutung ist, da dort die Verbindung zu SauceLabs initialisiert wird.
Wie auch immer, ich hoffe, dies könnte jemandem helfen, der eine ähnliche "globale" Parametrisierung seiner Tests durchführen möchte!