Python unittest pasando los argumentos a la clase de prueba principal

Tengo una clase de prueba principal llamada basetestcase () Esto es heredado por todas las clases de prueba

class BaseTestCase(unittest.TestCase): driver = None browser = read from command line operatingSystem = read from command line url = read from command line @classmethod def setUpClass(cls): """ SetUp to initialize webdriver session, pages and other needed objects Returns: None """ # Get webdriver instance # Browser should be read from the arguments if browser == "iexplorer": cls.driver = webdriver.Ie() elif browser == "firefox": cls.driver = webdriver.Firefox() elif browser == "chrome": cls.driver = webdriver.Chrome() else: cls.driver = webdriver.PhantomJS() # Similarly I want to get operating system and url also from command line driver.get(url) print("Tests are running on: " + operatingSystem) 

Entonces tengo dos clases de prueba separadas:

 class TestClass1(BaseTestCase): @classmethod def setUpClass(cls): super(TestClass1, cls).setUpClass() # Create object of another class to use in the test class # cls.abc = ABC() def test_methodA(self): # self.abc.methodFromABC() # This does not work # Not sure if I can use self.driver as it was defined as cls.driver in the setUpClass() self.driver.find_element(By.ID, "test_id").click() if __name__ == '__main__': unittest.main(verbosity=2) 

Esta es la segunda clase, ambas clases están en archivos .py separados

 class TestClass2(GUIBaseTestCase): @classmethod def setUpClass(self): super(TestClass2, self).setUpClass() def test_methodA(self): self.driver.find_element(By.ID, "test_id").click() if __name__ == '__main__': unittest.main(verbosity=2) 

Luego tengo un script de prueba, un archivo .py separado que los une para ejecutarse en una suite

 import unittest from tests.TestClass1 import TestClass1 from tests.TestClass2 import TestClass2 # Get all tests from TestClass1 and TestClass2 tc1 = unittest.TestLoader().loadTestsFromTestCase(TestClass1) tc2 = unittest.TestLoader().loadTestsFromTestCase(TestClass2) # Create a test suite combining TestClass1 and TestClass2 smokeTest = unittest.TestSuite([tc1, tc2]) unittest.TextTestRunner(verbosity=2).run(smokeTest) 

Quiero ejecutar el conjunto de pruebas y quiero proporcionar el navegador, el sistema operativo y la url a basetestcase desde la línea de comandos y estos argumentos son utilizados directamente por basetestcase.py. Las clases de prueba reales heredan el basetestcase.

    ¿Podría por favor ayudarme a obtener estos valores de la línea de comandos de la mejor manera y proporcionarlos a la base de datos?

    También luché para ejecutar los mismos casos de prueba en múltiples navegadores. Después de muchas iteraciones, pruebas y errores, y comentarios de amigos, implementé las siguientes soluciones para mis proyectos:

    Aquí, TestCase es la clase que tiene todas las pruebas y el controlador del navegador es Ninguno. SafariTestCase hereda el TestCase y reemplaza a setUpClass y establece que el controlador del navegador sea un controlador de safari y el mismo que ChromeTestCase, y puede agregar más clases para otros navegadores. La entrada de la línea de comandos se puede tomar en el archivo TestSuite y cargar condicionalmente las pruebas según los argumentos:

     class TestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.browser = None def test_1(self): self.assert(self.browser.find_element_by_id('test1') def test_2(self): self.assert(self.browser.find_element_by_id('test2') def test_3(self): self.assert(self.browser.find_element_by_id('test3') @classmethod def tearDownClass(cls): cls.browser.quit() class SafariTestCase(TestCase): @classmethod: def setUpClass(cls): cls.browser = webdriver.Safari(executable_path='/usr/bin/safaridriver') class ChromeTestCase(TestCase): @classmethod: def setUpClass(cls): cls.browser = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver') 

    En el archivo del corredor TestSuite.py:

     import TestCase as tc if len(sys.argv) == 1: print("Missing arguments, tell a couple of browsers to test against.") sys.exit(1) if sys.argv[1] == 'safari': test = unittest.TestLoader().loadTestsFromTestCase(tc.SafariTestCase) if sys.argv[1] == 'chrome': test = unittest.TestLoader().loadTestsFromTestCase(lt.ChromeTestCase) unittest.TextTestRunner().run(test)