#python #pytest
#python #pytest
Вопрос:
Я пытаюсь создать повторно используемые функции PyTest, которые передают кортеж объектов внутри класса. На данный момент я написал около 12 тестов для утверждения определенных условий, в частности, является ли объект None, object не None, Object является экземпляром str, а Object не является экземпляром str. Итак, я подумал, что 12 функций в значительной степени выполняют одно и то же, я мог бы сократить это число до 4 повторно используемых функций, используя @pytest.mark.paramtrize
.
Наконец, к сути проблемы. Я создаю набор данных, подобный следующему, и передаю набор данных в функцию paramtrize. В приведенном ниже примере я попытался передать возвращаемый объект fixture , а также попытался вызвать fixture напрямую, используя ()
, что приводит к предупреждению о прямом вызове fixtures .
Код
def setup_nifExplorer():
'''Returns a Nif Explorer Instance'''
explorer = NifExplorer()
explorer.BlockType = NifFormat.NiNode
explorer.ResultPath = None
explorer.SearchPath = None
return explorer
@pytest.mark.usefixtures("setup_nifExplorer")
class TestNifExplorer:
@pytest.mark.paramtrize('object', [setup_nifExplorer.BlockType, setup_nifExplorer.SearchPath, setup_nifExplorer.ResultPath])
def test_Object_Is_None(self, object):
assert object != None
def test_Class_Is_None(self, setup_nifExplorer):
assert setup_nifExplorer == None
def test_BlockType_Not_None(self, setup_nifExplorer):
assert setup_nifExplorer.BlockType != None
def test_BlockType_Is_None(self, setup_nifExplorer):
assert setup_nifExplorer.BlockType == None
def test_BlockType_Is_String(self, setup_nifExplorer):
assert isinstance(setup_nifExplorer.BlockType, str)
def test_BlockType_Not_String(self, setup_nifExplorer):
assert not isinstance(setup_nifExplorer.BlockType, str)
def test_SearchPath_Not_None(self, setup_nifExplorer):
assert setup_nifExplorer.SearchPath != None
def test_SearchPath_Is_None(self, setup_nifExplorer):
assert setup_nifExplorer.SearchPath == None
def test_SearchPath_Is_String(self, setup_nifExplorer):
assert isinstance(setup_nifExplorer.SearchPath, str)
def test_SearchPath_Not_String(self, setup_nifExplorer):
assert not isinstance(setup_nifExplorer.SearchPath, str)
def test_SearchPath_Directory_Does_Exist(self, setup_nifExplorer):
assert os.path.exists(setup_nifExplorer.SearchPath) == True
def test_SearchPath_Directory_Does_Not_Exist(self, setup_nifExplorer):
if setup_nifExplorer.SearchPath == None or os.path.exists(setup_nifExplorer.SearchPath) == False:
assert True
def test_ResultPath_Not_None(self, setup_nifExplorer):
assert setup_nifExplorer.ResultPath != None
def test_ResultPath_Is_None(self, setup_nifExplorer):
assert setup_nifExplorer.ResultPath == None
def test_ResultPath_Is_String(self, setup_nifExplorer):
assert isinstance(setup_nifExplorer.ResultPath, str)
def test_ResultPath_Not_String(self, setup_nifExplorer):
assert not isinstance(setup_nifExplorer.ResultPath, str)
def test_ResultPath_Directory_Does_Exist(self, setup_nifExplorer):
assert os.path.exists(setup_nifExplorer.ResultPath) == True
def test_ResultPath_Directory_Does_Not_Exist(self, setup_nifExplorer):
if setup_nifExplorer.ResultPath == None or os.path.exists(setup_nifExplorer.ResultPath) == False:
assert True
if __name__ == "__main__":
pytest.main()
Что я пробовал:
Среди множества поисковых запросов я наткнулся на открытую проблему на GitHub в качестве запроса функции, которая все еще остается открытой. Проблема была поднята еще в 2013 году. https://github.com/pytest-dev/pytest/issues/349
Не поймите меня неправильно, другие тесты работают, я просто пытаюсь уменьшить количество ненужных функций.
Я использую сообщество Visual Studio 2019 вместе с Python 3.9.1
и PyTest 6.2.1
.
Редактировать 1
@pytest.mark.parametrize('funcs', [SearchPath_None, ResultPath_None, BlockType_None])
def test_NifExplorer_Variables_None(self, setup_nifExplorer, funcs):
funcs(self,setup_nifExplorer)
def SearchPath_None(self, setup_nifExplorer):
assert setup_nifExplorer.SearchPath == None
def ResultPath_None(self, setup_nifExlorer):
assert setup_nifExlorer.ResultPath == None
def BlockType_None(self, setup_nifExplorer):
assert setup_nifExplorer.BlockType == None
Комментарии:
1. Прямо сейчас вы пытаетесь получить доступ к атрибутам самой функции fixture, что не имеет смысла, и у вас есть опечатка в названии метода (параметр e trize). Но если вы вызываете его со списком из трех значений, ваш тест выполняется три раза — я думаю, вы хотите большего. Обычно вы группируете параметризованные тесты таким образом, чтобы все тесты в группе утверждали одно и то же, в противном случае тест заканчивается полной условной логикой.
2. @jonrsharpe Когда вы ссылаетесь на группировку тестов вместе, вы имеете в виду что-то вроде Edit 1 ? Если нет, не могли бы вы уточнить, пожалуйста.
Ответ №1:
Кажется, что передача @pytest.fixture
возвращаемых данных в @pytest.mark.parametrize
данный момент невозможна.
Существует открытая проблема Github, найденная здесь: использование приспособлений в pytest.mark.parametrize #349
Я отошел от этой идеи, пока она не может быть адекватно реализована с легкостью.