Как импортировать отдельные тесты unittest без выполнения остального кода донорского модуля?
Имеются два файла:
- основной, из которого будет запускаться группа тестов, общих для разных вариантов тестирования,
- и один из дополнительных, где имеются тесты для одного из интерфейсов сайта.
Тесты выполняются успешно. Но перед выполнением тестов модуля common_base.py выполняется весь модуль test_set1.
Вопрос - как добавить в процесс выполнения common_base.py тесты из модуля test_set1 так, чтобы не выполнялись остальные тесты модуля test_set1? Или чтобы они не выполнялись хотя бы перед тем как эти тесты будут запрошены в ходе выполнения тестов основного модуля common_base.py.
Добавление if __name__ == '__main__': в код любого из модулей приводит к пропуску всех следующих за выражением тестов.
Основной файл common_base.py выглядит примерно так:
import unittest
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.common.exceptions import WebDriverException
from test_set1 import MyTestCase
login = ''
password = ''
url = 'common_base_url'
s = Service('chromedriver/chromedriver')
driver = webdriver.Chrome(service=s)
def auth(a, b):
if 'user_nickname' in driver.page_source:
try:
user_nickname_input = driver.find_element(By.ID, "user_nickname")
user_pass_input = driver.find_element(By.NAME, "user_password")
submit_input = driver.find_element(By.CSS_SELECTOR, "input[type = submit]")
user_nickname_input.send_keys(login)
user_pass_input.send_keys(password)
submit_input.click()
time.sleep(3)
except WebDriverException:
print('не удалось найти на странице какой-либо из ожидаемых элементов: user_nickname, user_password, input[type = submit]')
else: print("аутентификация не потребовалась")
def method2():
print('common_base.method2')
def method3():
print('common_base.method3')
class Common(unittest.TestCase):
def test_1_open_sitemap(self):
driver.get(url)
driver.maximize_window()
auth(login, password)
time.sleep(3)
self.assertTrue(' \\ expected text' in driver.page_source)
time.sleep(3)
def test_2_do_something(self):
# код теста 2
# ЗДЕСЬ НЕОБХОДИМО ИСПОЛЬЗОВАТЬ ТЕСТЫ ОДНОГО ИЛИ БОЛЬШЕ ВСПОМОГАТЕЛЬНЫХ ФАЙЛОВ: test_set1.py test_set2.py
MyTestCase.test_1(self)
def test_5_do_something(self):
# код теста 5
def test_6_back_to_url(self):
backbutton = driver.find_elements(By.XPATH, '//div[@data-original-title="Наверх"]')
self.assertTrue(str(len(backbutton))=='1')
backbutton[0].click()
driver.quit()
Примерный код test_set1.py:
import unittest
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
s = Service('chromedriver/chromedriver')
driver = webdriver.Chrome(service=s)
driver.maximize_window()
url = 'test_set1_url'
operator_login = ''
operator_phone = ''
def operator_auth(a, b):
'Аутентификация оператора'
# если поле ввода логина имеется, то вводим логин и номер телефона, и отправляем
if 'login' in driver.page_source:
try:
user_login = driver.find_element(By.NAME, "login")
user_phone_number = driver.find_element(By.NAME, "instrument")
submit_button = driver.find_element(By.ID, "login-button")
user_login.send_keys(operator_login)
user_phone_number.send_keys(operator_phone)
submit_button.click()
time.sleep(3)
print("аутентификация оператора проведена")
except WebDriverException:
print(
'не удалось найти на странице какой-либо из ожидаемых элементов: user_login, user_phone_number, submit_button')
else:
print("поле login не найдено")
class MyTestCase(unittest.TestCase):
operator_auth(operator_login, operator_phone)
def test_1(self):
driver.get(url)
time.sleep(3)
self.assertTrue(" \\ expected text" in driver.page_source)
def test_2(self):
#код теста 2
def test_3(self):
#код теста 3
driver.quit()
Ответы (1 шт):
Уберите весь код с верхнего уровня:
# common_base.py
# тут не должно быть создания драйвера как было раньше
# это все перемещено в setUpClass теста
class Common(unittest.TestCase):
@classmethod
def setUpClass(cls):
s = Service('chromedriver/chromedriver')
cls.driver = webdriver.Chrome(service=s)
cls.set1 = MyTestCase(cls.driver)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
def auth(self, a, b):
if 'user_nickname' in self.driver.page_source:
try:
user_nickname_input = self.driver.find_element(By.ID, "user_nickname")
... тут как и было только вместо driver используем self.driver
except WebDriverException:
# вместо print нужно бросать AssertError с помощью метода self.fail
# self.fail('не удалось найти на странице какой-либо из ожидаемых элементов: user_nickname, user_password, input[type = submit]')
# тогда тест не будет продолжать выполнение в случае ошибки
print('не удалось найти на странице какой-либо из ожидаемых элементов: user_nickname, user_password, input[type = submit]')
else: print("аутентификация не потребовалась")
def method2(self):
print('common_base.method2')
def method3(self):
print('common_base.method3')
def test_1_open_sitemap(self):
self.driver.get(url)
self.driver.maximize_window()
self.auth(login, password)
time.sleep(3)
self.assertTrue(' \\ expected text' in self.driver.page_source)
time.sleep(3)
def test_2_do_something(self):
# код теста 2
def test_3_do_something(self):
# код теста 3
def test_4_test_1(self):
self.set1.test_1()
def test_4_test_2(self):
self.set1.test_2()
def test_5_do_something(self):
# код теста 5
def test_6_back_to_url(self):
backbutton = self.driver.find_elements(By.XPATH, '//div[@data-original-title="Наверх"]')
...
# driver.quit() тоже переехал в tearDownClass чтобы он выполнялся не во время импорта
# а после выполнения теста
Так как MyTestCase вызывается из Common, то его вообще не нужно наследовать от unittest.TestCase, а driver передавать при создании:
# test_set1.py
class MyTestCase:
def __init__(self, driver):
self.driver = driver
def test_1(self):
self.driver.get(url)
time.sleep(3)
self.assertTrue(" \\ expected text" in driver.page_source)
def test_2(self):
#код теста 2
def test_3(self):
#код теста 3