Модульные PyTests

#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

Я отошел от этой идеи, пока она не может быть адекватно реализована с легкостью.