Запуск всех тестов Python из разных модулей в виде набора с параметризованным конструктором класса - PullRequest
0 голосов
/ 02 июня 2018

Я работаю над шаблоном проектирования, чтобы сделать мой python unittest в качестве POM, поэтому я написал свои классы страниц в модулях HomePageObject.py, FilterPageObject.py, мой базовый класс (для обычных вещей) TestBase in BaseTest.py, мои тестовые модули TestCase1.py и TestCase2.py и один модуль бегуна runner.py.В классе бегуна я использую loader.getTestCaseNames, чтобы получить все тесты из класса testcase модуля.В обоих модулях testcase имя класса теста совпадает с 'Test', а имя метода совпадает с 'testName' Поскольку имена импортируются при импорте в runner, выполняется только один тест.Я хочу, чтобы python просканировал все модули, которые я указал для тестов в них, и запустил те, у которых даже имена классов совпадали.Я узнал, что nose может быть полезным в этом, но не уверен, как я могу реализовать это здесь.Любой совет ?

BaseTest.py

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ChromeOptions
import unittest

class TestBase(unittest.TestCase):

    driver = None

    def __init__(self,testName,browser):

        self.browser = browser
        super(TestBase,self).__init__(testName)

    def setUp(self):

        if self.browser == "firefox":
            TestBase.driver = webdriver.Firefox()

        elif self.browser == "chrome":
            options = ChromeOptions()
            options.add_argument("--start-maximized")
            TestBase.driver = webdriver.Chrome(chrome_options=options)
        self.url = "https://www.airbnb.co.in/"
        self.driver = TestBase.getdriver()
        TestBase.driver.implicitly_wait(10)

    def tearDown(self):
        self.driver.quit()

    @staticmethod
    def getdriver():
        return TestBase.driver

    @staticmethod
    def waitForElementVisibility(locator, expression, message):
        try:
            WebDriverWait(TestBase.driver, 20).\
                until(EC.presence_of_element_located((locator, expression)),
                   message)
            return True
        except:
            return False

TestCase1.py и TestCase2.py (одинаковые)

from airbnb.HomePageObject import HomePage
from airbnb.BaseTest import TestBase

class Test(TestBase):

    def __init__(self,testName,browser):
        super(Test,self).__init__(testName,browser)

    def testName(self):
        try:
            self.driver.get(self.url)

            h_page = HomePage()

            f_page = h_page.seachPlace("Sicily,Italy")

            f_page.selectExperience()

        finally:
            self.driver.quit()

runner.py

import unittest
from airbnb.TestCase1 import Test
from airbnb.TestCase2 import Test

loader = unittest.TestLoader()

test_names = loader.getTestCaseNames(Test)
suite  = unittest.TestSuite()

for test in test_names:
    suite.addTest(Test(test,"chrome"))

runner = unittest.TextTestRunner()
result = runner.run(suite)

Такжедаже если один тестовый пример проходит, появляется какое-то сообщение об ошибке

Ran 1 test in 9.734s

OK
Traceback (most recent call last):
  File "F:\eclipse-jee-neon-3-win32\eclipse\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\runfiles.py", line 275, in <module>
    main()
  File "F:\eclipse-jee-neon-3-win32\eclipse\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\runfiles.py", line 97, in main
    return pydev_runfiles.main(configuration)  # Note: still doesn't return a proper value.
  File "F:\eclipse-jee-neon-3-win32\eclipse\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\_pydev_runfiles\pydev_runfiles.py", line 874, in main
    PydevTestRunner(configuration).run_tests()
  File "F:\eclipse-jee-neon-3-win32\eclipse\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\_pydev_runfiles\pydev_runfiles.py", line 773, in run_tests
    all_tests = self.find_tests_from_modules(file_and_modules_and_module_name)
  File "F:\eclipse-jee-neon-3-win32\eclipse\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\_pydev_runfiles\pydev_runfiles.py", line 629, in find_tests_from_modules
    suite = loader.loadTestsFromModule(m)
  File "C:\Python27\lib\unittest\loader.py", line 65, in loadTestsFromModule
    tests.append(self.loadTestsFromTestCase(obj))
  File "C:\Python27\lib\unittest\loader.py", line 56, in loadTestsFromTestCase
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
TypeError: __init__() takes exactly 3 arguments (2 given)

1 Ответ

0 голосов
/ 02 июня 2018

Я сделал это путем поиска всех модулей тестовых классов с шаблоном, а затем использовал __import__(modulename) и вызвал его Test класс с нужными параметрами,

Вот мой runner.py

import unittest
import glob
loader = unittest.TestLoader()
suite  = unittest.TestSuite()

test_file_strings = glob.glob('Test*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]

for module in module_strings:
    mod = __import__(module)
    test_names =loader.getTestCaseNames(mod.Test)
    for test in test_names:
        suite.addTest(mod.Test(test,"chrome"))

runner = unittest.TextTestRunner()
result = runner.run(suite)

Это сработало , но все еще ищет некоторые организованные решения.(Не уверен, почему во второй раз он показывает тесты Ran 0 через 0.000 с)

Finding files... done.
Importing test modules ... ..done.

----------------------------------------------------------------------
Ran 2 tests in 37.491s

OK

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
...