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

Пишу тесты на 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, описанный в документации (6. Page Objects — Selenium Python Bindings 2 documentation) - когда я захочу в странице-объекте 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()
1 лайк

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

Да, конечно

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')

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

1 лайк

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

Подниму еще раз этот вопрос. Хотелось бы понять, существует ли решение данной проблемы?

Используйте аннотации