setUp вызывается перед каждым тестовым методом, т.е. у тебя он вызывается 14 раз, как и
tearDown. Замени его на
setUpClass, который будет вызван всего 1 раз. И соответственно,
tearDown меняешь на
tearDownClass.
И конечно меняешь свои тесты (например убери лишние
self.driver.set_window_size(1920, 1080) и т.п. в каждом методе, просто переместив это в
setUpClass). Это все ОЧЕНЬ сильно сэкономит время.
Либо, чтобы убрать дублирование кода можно воспользоваться контекстным менеджером subTest:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
URL = 'https://psy.edu.ru/'
class check_psyedu(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(r'C:\Users\Алексей\YandexDisk\Job\Python\Test\chromedriver\chromedriver.exe')
self.driver.set_window_size(1920, 1080)
def test_1(self):
names = ("aleksei", "Алексей", " Рынденков Алексей",)
for name in names:
# тут name просто как название теста, чтобы когда тест не прошёл было наглядно видно где споткнулся
with self.subTest(name):
self.driver.get(URL)
self.driver.find_element(By.NAME, "name").send_keys(name)
self.driver.find_element(By.CSS_SELECTOR, ".btn").click()
assert self.driver.find_element(By.CSS_SELECTOR,
".still-quest_item:nth-child(1) > .err_message").text == "Напишите русскими буквами!"
assert self.driver.find_element(By.CSS_SELECTOR, ".err_message:nth-child(3)").text == "Обязательное поле!"
assert self.driver.find_element(By.CSS_SELECTOR, ".still-quest_item:nth-child(3)").text == "Обязательное поле!"
def tearDown(self):
self.driver.close()
self.driver.quit()
if __name__ == "__main__":
unittest.main()
Есть еще третий вариант, использовать декоратор добавляющий возможность запускать одну и ту же тестовую функцию с разными аргументами. В pytest такая "фича" встроена, в unittest нужно использовать библиотеку
parameterized.
Пример:
@parameterized([
(2, 2, 4),
(2, 3, 8),
(1, 9, 1),
(0, 9, 0),
])
def test_pow(base, exponent, expected):
assert_equal(math.pow(base, exponent), expected)