Как импортировать отдельные тесты 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 шт):

Автор решения: Roman-Stop RU aggression in UA

Уберите весь код с верхнего уровня:

# 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
→ Ссылка