Не получается импортировать fixture в тест

pytest
webdriver
Теги: #<Tag:0x00007fedc0206ba0> #<Tag:0x00007fedc02069e8>

(Elvis Presley ) #1

Доброе время суток. Есть тест (с помощью selenium) - проверка добавления в корзину товара. Создал отдельный файл selenium_fixture, который бы открывал и закрывал браузер:

from selenium import webdriver
import pytest

@pytest.fixture
def driver(request):
driver = webdriver.Firefox()
driver.implicitly_wait(10)
request.addfinalizer(driver.quit)
return(driver)

В самом тесте пишу from selenium_fixture import driver, но почему то не импортируется. Делаю в среде разработке pycharm. Библиотеку pytest добавил в окружение. Также в настройках в разделе Python intagrated tools в поле Default test runner поставил py.test. Все равно тест не запускается, модуль не импортируется.

Подскажите что это может быть, что не так делаю?


(rmerkushin) #4

Используйте файл conftest.py, там ничего импортировать не нужно будет.
З.Ы.: советую еще посмотреть как делать singleton для вебдрайвера :slightly_smiling:


(MaximDae) #5

C singleton не будет в будущем проблем с параллелизацией тестов?


(rmerkushin) #6

Утверждать не стану, но по идее не должны мешаться друг другу, т.к. это будут разные инстансы
P.S.: если запускать в разных процесса то точно не будут мешать друг другу :slightly_smiling:


(Elvis Presley ) #7

conftest тоже не импортируется, тесты не запускаются, вот такое выдает:
Traceback (most recent call last):
File "C:\PyCharm 4.0.5\helpers\pycharm\pytestrunner.py", line 58, in
main()
File "C:\PyCharm 4.0.5\helpers\pycharm\pytestrunner.py", line 31, in main
pluginmanager=_pluginmanager, args=args)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 724, in call
return self.hookexec(self, self.nonwrappers + self._wrappers, kwargs)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 338, in _hookexec
return self.innerhookexec(hook, methods, kwargs)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 333, in
MultiCall(methods, kwargs, hook.specopts).execute()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 595, in execute
return wrappedcall(hook_impl.function(*args), self.execute)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 249, in wrappedcall
wrap_controller.send(call_outcome)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\helpconfig.py", line 28, in pytest_cmdline_parse
config = outcome.get_result()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 279, in get_result
_reraise(*ex) # noqa
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 264, in init
self.result = func()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 596, in execute
res = hook_impl.function(*args)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 861, in pytest_cmdline_parse
self.parse(args)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 966, in parse
self._preparse(args, addopts=addopts)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 937, in _preparse
args=args, parser=self._parser)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 724, in call
return self.hookexec(self, self.nonwrappers + self._wrappers, kwargs)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 338, in _hookexec
return self.innerhookexec(hook, methods, kwargs)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 333, in
MultiCall(methods, kwargs, hook.specopts).execute()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 595, in execute
return wrappedcall(hook_impl.function(*args), self.execute)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 253, in wrappedcall
return call_outcome.get_result()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 279, in get_result
_reraise(*ex) # noqa
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 264, in init
self.result = func()
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\vendored_packages\pluggy.py", line 596, in execute
res = hook_impl.function(*args)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 907, in pytest_load_initial_conftests
self.pluginmanager.setinitial_conftests(early_config.known_args_namespace)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 266, in setinitial_conftests
self.tryload_conftest(anchor)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 272, in tryload_conftest
self._getconftestmodules(anchor)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 286, in _getconftestmodules
clist = self._getconftestmodules(path.dirpath())
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 297, in _getconftestmodules
mod = self._importconftest(conftestpath)
File "C:\PycharmProjects\palto-deti\ENV\lib\site-packages_pytest\config.py", line 322, in _importconftest
raise ConftestImportFailure(conftestpath, sys.exc_info())
_pytest.config.ConftestImportFailure: (local('C:\PycharmProjects\palto-deti\conftest.py'), (, TypeError('fixture() takes no arguments (1 given)',), ))


(rmerkushin) #8

Ну судя по последней строке в какую то из фикстур передается лишний аргумент.


(Alexander Petrovich) #9

Из conftest.py не нужно ничего руками импортировать, пайтест делает это за вас.
Попробовал банально взять вашу фикстуру, положил, как люди советовали, в conftest.py. В той же директории test_sample.py с кодом типа

def test_sample(driver):
    driver.get('https://google.com')

Работает как задумано. Вы делали так же?


(Elvis Presley ) #10

Вроде стали запускаться, но сейчас новая проблема. Запускается тест и на первой строчке сразу падает и пишет: app =
def test_sample(app):

  app.go_to_home_page()

E AttributeError: 'Application' object has no attribute 'go_to_home_page'
test_sample.py:6: AttributeError

Посмотрите код, где я допустил ошибку?



Заранее спасибо за ответы.


(ex3me0) #11

Отступы, Карл!
Не огорчайтесь, я, например, тоже не сразу заметил, пока не призумил скриншот)

http://i.imgur.com/W0d8bEW.png


(Sergey Korol) #12

Сообщение перенесено в новую тему: Проверка редактирования и обновления товара в корзине


(Elvis Presley ) #13

Спасибо, всё получилось.


(Sergey Chkalovskiy) #14

И всё же.
Как использовать фикстуру, которая находится НЕ в conftest.py?

При попытке сделать так:

# fixtures.py
def fixure_1():
    pass

# test_1.py:
import fixtures

def test_a(fixtures.fixture_1):
    assert a == 1

получаю ошибку:

E       def test_a(fixtures.fixture_1):
E                          ^
E   SyntaxError: invalid syntax

Что не так с синтаксисом?


(rmerkushin) #15

(Sergey Chkalovskiy) #16

Работает, спасибо за ссылку!

А ещё можно так:

# test_1.py:
from fixtures import fixture_1

def test_a(fixture_1):
    assert a == 1