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

Вопрос по PyTest, автокомплиту и PyCharm

ide
pytest
pycharm
python
Теги: #<Tag:0x00007f7b6210b2a8> #<Tag:0x00007f7b6210b118> #<Tag:0x00007f7b6210afb0> #<Tag:0x00007f7b6210ae20>

(Max Davion) #1

Пишу тесты на python + py.test и напрягает одна особенность с автокомплитом.

Допустим есть фикстура базы данных:

@pytest.yield_fixture
def mngdb():
    mngdb = MngDBHelper()
    yield mngdb
    mngdb.destroy() 

В MngDBHelper() есть ряд методов для работы с БД. Проблема, в том, что когда я передаю эту фикстуру в тест, то после написания mngdb. - PyCharm не предлагает автокомплитом методы класса MngDBHelper()

def test_login(mngdb):
    mngdb.get_random_user()
    ...

В принципе, это не такая большая проблема, и характер её понятен (как я понял, в статике IDE не знает ничего о содержимом mngdb), но с автокомплитом реально удобнее. C этим мирятся или как то по другому решают проблему?

Конечно можно отказаться от фикстуры mngdb и просто импортировать модуль mngdb, но это только частный случай. Есть пример серьезнее - Например page object, описанный в документации (http://selenium-python.readthedocs.org/page-objects.html) - когда я захочу в странице-объекте MainPage(), сделать новый метод:

def click_home_button(self):
    element = self.driver.find_element(*MainPageLocators.HOME_BUTTON)
    element.click() 

то после self.driver. - автокомплит не предложит команды вебдрайвера - что опять же очень неудобно.

Вопрос в том, можно ли как-то настроить PyCharm? Или если хочешь автокомплит методов вебдрайвера, в страницах-объектах - то обязательно нужно объявлять webdriver в init BasePage?

class BasePage(object):
    def __init__(self):
        self.wd = webdriver.Chrome()

(Viktor) #2

Можете выложить пример кода MngDBHelper? PyCharm может “угадать” объект рантайма, и, без напильника делает это получше, например, Эклипса, но все же ограничения есть.


(Max Davion) #3

Да, конечно

mngdb.py

from pymongo import MongoClient

class MngDBHelper:

    def __init__(self):
        self.host = 'localhost'
        self.port = '27017'
        self.client = MongoClient(host=self.host, port=self.port)

    def get_user_by_email(self, email):
        db = self.client.dbname
        cursor = db.User.find_one({ "email": "%s" % email } )
        return cursor.get('name')

    def destroy(self):
        self.client.close()

conftest.py

import pytest
from mngdb import MngDBHelper

@pytest.yield_fixture
def mngdb():
    mngdb = MngDBHelper()
    yield mngdb
    mngdb.destroy()

test_one.py

def test_one(mngdb):
    mngdb.get_user_by_email('my_email@domain.com')

(5am) #4

можно попробовать включить "File - Settings - Python Debugger галка “Collect run-time types information for code insight”


(Пётр Алексеев) #5

Аналогичная проблема( Что можно сделать?