Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Запуск отдельного теста в class'e и запуск assert

pytest
pycharm
python
selenium
testng
Теги: #<Tag:0x00007f7b6336f958> #<Tag:0x00007f7b6336f818> #<Tag:0x00007f7b6336f688> #<Tag:0x00007f7b6336f548> #<Tag:0x00007f7b6336f408>

(Olexander Davis) #1

Если запускаю все сразу, то все ок, если хочу запустить отдельный тест, результат:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/alexandertunick/PycharmProjects/TestSDmainPage/test_my_test.py

Process finished with exit code
Не понятно.

Второй вопрос, когда использую команду assert в классе, тест постоянно падает, потому что не находит элемент указанный в mistake_text = self.driver.find_element_by_xpath("//*[@id=‘react-select-3–value’]/div[1]").text
Падает только если использую его здесь в class, если без него то все находит и нормально.

Сори, за примитивные вопросы, но уже задолбался с этими мелкими проблемами которые постоянно выплывают и перебивают работу, когда кажеться что все ок и должно работать.


(Maxim Zaitsev) #2

Для начала обрати внимание, что имя тестов у тебя одинаковое: test_login


(Maxim Zaitsev) #3

А насчет “все время падает” нужен лог с ошибкой (stacktrace), чтобы выяснить причину. Скорее всего, элемент не успевает отобразиться на экране.
Пришло время для знакомства с явными ожиданиями элементов на странице по разным условиям:
http://selenium-python.readthedocs.io/waits.html


(Olexander Davis) #4

да, я уже прочитал здесь про implicit and explicit wait

Но тут я выставлял time.sleep(7) оно всеравно не находило, хотя без класса находит.
Знаю что time.sleep это низы ожидания, но чисто для сравнения результат же показал, что не там находит а там нет…


(Maxim Zaitsev) #5

Имена тестов сделал разными? Есть предположение, что без класса у тебя запускается один “test_login”, а в классе падает другой “test_login”.

Лог ошибки в студию! Иначе так до второго пришествия будем гадать, почему не находит.


(Olexander Davis) #6

так, фишка в том что и ошибки нету и ничего не падает, просто браузер запускается и в логе пишет:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6/Users/alexandertunick/PycharmProjects/TestSDmainPage/test_my_test.py

Process finished with exit code 0


(Maxim Zaitsev) #7

Удали в левом окне конфигурацию:

Python
test_my_test


(Olexander Davis) #8

Удалил, при запуске он все равно появляеться там же. Так и в поп ап меню не пропадает. Буду перекидать pycharm и пайтон на компе, возможно эти все косяки первой установки которая делалась не последовательно…


(Olexander Davis) #9
> from selenium import webdriver
> import time
> from selenium.webdriver.common.by import By
> from selenium.webdriver.support.ui import WebDriverWait
> from selenium.webdriver.support import expected_conditions as EC


> #login
> #forgot password

> app_url = 'http://schooldata-test.com/'

> class TestSmokeSuite:

>  def setup_method(self, method):
>      self.driver = webdriver.Chrome()
>      self.driver.get("http://schooldata-test.com/")
>      self.driver.maximize_window()
>  def teardown_method(self, method):
>      self.driver.quit()

>  def test_my_first(self):
>     self.driver.find_element_by_name("query").send_keys("se")
>     time.sleep(8)
>     self.driver.find_element_by_xpath("//*[@id='root']/div/div[2]/div/h1").click()
>     time.sleep(3)
>     self.driver.find_element_by_xpath("//*[@id='root']/div/div[2]/div/form/button").click()
>     try:
>         element = WebDriverWait(self.driver, 20).until(
>             EC.presence_of_element_located((By.ID, "adress"))
>         )
>     finally:
>         self.driver.find_element_by_id("adress").send_keys("hello")

>  def test_second(self):
>      self.driver.find_element_by_name("query").send_keys("se")
>      time.sleep(8)
>      self.driver.find_element_by_xpath("//*[@id='root']/div/div[2]/div/h1").click()
>      time.sleep(3)

Вот уже все переустановил, все классно работает, но отдельный тест из class не запускается, при запуске в конфигурациях в python создается файл под названием все теста и в логе просто появляется текст

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/alexandertunick/PycharmProjects/SchoolData/SchoolDataDirectory/SchoolDataTests/TestSmokeAdminPanel.py

Process finished with exit code 0

Походу без класса придетса работать… ааа


(Maxim Zaitsev) #10

Скопировал твой файл в свой Pycharm. Все запускается нормально: как классом, так и по отдельности. Какие-то глюки, видимо, с Pycharm.


(zub_test) #12

PyCharm/Preferences/Tools/Python Integrated Tools
Тут нужно выставить Default test runner: py.test

Затем удалить автоматически созданные конфигурации (как было выше test_my_test).
Затем кликнуть ПКМ по названию тестового метода. В открывшемся меню выбираем: Run py.test in…


(Olexander Davis) #13

Default runner у меня pytest уже был выбран, осьальное сделал, даже создал новый файл. Все равно при запуске создается авто конфигурация в python, которая запускается (скриншот1)

Вот создал новый файл, обновил в найстройках pytest, setuptools, selenium до последней версии.
Все равно, когда кликаю ПКМ в RUN имя файла, который при запуске сам сгенерируется в конфигурациях.
ну что за бред?


(zub_test) #14

Похоже проблема в naming conventions: https://docs.pytest.org/en/latest/example/pythoncollection.html#changing-naming-conventions

By default, pytest will consider any file matching with test_*.py and *_test.py globs as a test module.

By default, pytest will consider any class prefixed with Test as a test collection.

By default, pytest will consider any function prefixed with test as a test.

Получается первое правило не проходит.
Нужно поправить название файла trial_file.py -> test_trial_file.py

Попробуйте сделать новый проект с нуля с двумя простыми тестами (не селениум, просто assert 2+2 == 4) и посмотрите заработает ли запуск отдельного теста.


(zub_test) #15

Странно только что сьютом всё работает… Может в conftest.py есть переопределение типа python_files = Test* ?
Тогда, наверное, пайчарм не детектит это переопределение, поэтому и не даёт запускать по одному тесту (это просто догадка, нужно проверить)


(Olexander Davis) #16

Сделал все так, как вы сказали, все ок, и класс запускается и функции по отдельности тоже, прекрасно. В конфигурациях создались pytest для все класса и для функции in, for
Скриншоты 1,2
Но, в этом же проекте создал новый файл с параметрами которые хочу вставить и на тебе, снова эта проблема, посмотрите пожалуйтса, может я просто что то не правильно написал/сделал (screen 3)

Но, в этом же проекте создал новый файл с параметрами которые хочу вставить и на тебе, снова эта проблема, посмотрите пожалуйтса, может я просто что то не правильно написал/сделал


(Olexander Davis) #17

блин, ну неужели никто не может подскахзать в чем может быть проблема…


(Olexander Davis) #18

Интересно что как только все приберу и оставлю вот так, то все работает ок


(zub_test) #19

Это уже здорово. Пробуйте постепенно добавлять функции (чтобы получить желаемое). И смотрите после добавления чего всё перестаёт работать.

Сделал у себя тестовый проект с вашим кодом из комментария выше. Закинул его на гитхаб: https://github.com/skalozubov/pytest-demo/tree/master Попробуйте скачать и открыть у себя. В readme необходимые степы. Сами тесты, конечно, не проходят, но детектятся pytest-ом.
У меня PyCharm CE 2016.2.3
Python 3.6

Если снова что-то не работает - давайте код. А то со скриншотами не очень удобно работать


(Olexander Davis) #20

Спасибо за ответ.
Использую
Pycharm Community 2017.2
Python 3.6.2

C таким кодом все запускается по отдельности и классом.

> from selenium import webdriver
> driver = webdriver.Chrome()

> class TestFun:

>  def test_login_fun(self):
>      self.driver.get("url")
>      self.driver.find_element_by_xpath("//input[@type='email']").send_keys("dasdasd")
>      self.driver.find_element_by_xpath("//input[@type='password']").send_keys("asdasd")
>      self.driver.find_element_by_xpath("//button[@type='submit']").click()
>      self.driver.find_element_by_xpath("/html/body/div[1]/aside[1]/section/ul/li[3]/a").click()
>      self.driver.find_element_by_xpath("/html/body/div[1]/aside[1]/section/ul/li[3]/ul/li[1]/a").click()
>      self.driver.find_element_by_xpath("//input[@type='checkbox']").click()
>     #driver.quit()

>  def test_logout_fun(self):
>      self.driver.find_element_by_xpath("//input[@type='email']").send_keys("asdasd")
>      self.driver.find_element_by_xpath("//input[@type='password']").send_keys("asdasd")
>      self.driver.find_element_by_xpath("//button[@type='submit']").click()

Но только добавляю после строки класс вот эти функции(любую из них), например:
def setup_method(self, method):
def teardown_method(self, method):
def init(self):
Сразу после нажатия ПКМ в Run показано название файла заместь функции или класса по типу py.test for blabla bla

Что интересно, эта ситуация на робочем маке и на моем личном маке, странно, в соседа по столу тоже всякие приколы постоянно но такого небыло и он уже успешно вынес класс в отдельный файл и оптимизировал тесты как я хочу сделать


(Olexander Davis) #21

скачал, запустил
example test файл - все работает отлично
demo test файл - проблема все та же, правда тут еще pytest в файле requiremetns is not satisfied