Как правильно организовать структуру тест-сьюта?

unittest
python
webdriver
selenium
Теги: #<Tag:0x00007fedbbd5d2d8> #<Tag:0x00007fedbbd5d120> #<Tag:0x00007fedbbd5cec8> #<Tag:0x00007fedbbd5cb58>

(Павел Уколов) #1

Всем привет! Подскажите, пожалуйста, почему происходит следующая ситуация.

У меня есть четыре файла (работаю с Python + unittest + selenium webdriver): test.py и test1.py(непосредственно модули с тестами), base.py и module_testsuite.py.

test.py / test1.py имеют примерно следующую структуру:

class ClassUnderTest(Test_Base):

	def test_add_entity(self, parameters):

		self.driver = Test_Base.driver
		self.wait = Test_Base.wait
                self.driver.get('http://url')

                ...etc

module_testsuite.py выглядит примерно так:

def suite():
    tsuite = unittest.defaultTestLoader.loadTestsFromTestCase(Test)
    tsuite.addTest(unittest.makeSuite(test.ClassUnderTest))
    return tsuite

if __name__ == "__main__":
    result = unittest.TextTestRunner().run(suite())
    sys.exit(not result.wasSuccessful())

и base.py, в котором, как я подозреваю, и кроется проблема:

class Test_Base(unittest.TestCase):

	driver = None
	wait = None

	if driver == None:

		def __init__(self): # пробовал вставлять  "*args, **kwargs" - ошибка одна и та же (было написано в трассировке, что для __инит__ нужно два порядковых аргумента, а я, мол, передал один
			
			self.driver = self.driver
			self.wait = self.wait
			self.tearDownClass()

		@classmethod
		def setUpClass(cls):
			cls.driver = webdriver.Firefox()
			cls.wait = WebDriverWait(cls.driver, 20)
			cls.driver.maximize_window()
			cls.driver.get('http://url')
			cls.driver.find_element_by_id('Login').send_keys('USER')
			cls.driver.find_element_by_id('Password').send_keys('PASSWORD')
			submit = cls.driver.find_element_by_class_name('submit')
			submit.click()

		@classmethod
		def tearDownClass(cls):
			cls.driver.quit()
			cls.driver = None
			cls.wait = None
			return cls.driver
			return cls.wait

при запуске файла с тест-сьютом получаю ошибку: “AttributeError: ‘TestCaseFunction’ object has no attribute ‘_testcase’”. init пришлось добавлять, чтобы обойти другую ошибку - каждый раз при запуске тест-сьюта первый тест-кейс выполнялся, а до второго очередь не доходила, потому что драйвер закрывался после исполнения первого кейса, и появлялась ошибка ConnectionError Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение (при этом отдельно тест-кейсы запускались и отлично исполнялись, либо я убирал из base.py метод tearDownClass - всё работало, но браузер в конце не закрывался). После того, как я начал с помощью init переопределять переменную driver, именно ошибка с подключением исчезла - браузер закрывался и открывался снова на следующем тест-кейсе, но теперь появилась проблема, описанная выше. Подскажите, пожалуйста, где моя ошибка? Либо как можно ещё организовать base.py, чтобы не переопределять каждый раз переменную driver, но и чтобы не было исключения “ConnectionError”. Есть подозрение, что я в целом использую неверный подход… :frowning:

Заранее большое спасибо!


(Павел Уколов) #2

Решено с помощью использования синглтона.