параметризация pytest на основе данных, полученных из пользовательских классов - PullRequest
0 голосов
/ 24 сентября 2019

Как я могу параметризовать тестовую функцию, используя данные, которые я получаю из других пользовательских классов?В документации я вижу только примеры параметризации статических данных, представленных в виде глобального списка кортежей.

В моем случае я тестирую написанную мной функцию, которая находит изображение в другом изображении.Это выглядит так:

def search_for_image_in_image(screenshot_path, detectable_path):
    """
    Uses template matching algorithm to detect an image within an image
    :param screenshot_path: Path to the screenshot to search
    :param detectable_path: Path to the detectable to search for
    :return: tuple containing:
        (bool) - Whether or not the detectable was found within the screenshot, using
            the given epsilon
        (float) - Maximum value the algorithm found
        (list) - x and y position in the screenshot where the maximum value is located. 
            Or in other words, where the algorithm thinks the top left of the detectable
            is most likely to be (if it is there at all)  

Итак, я настроил некоторые примеры данных для тестирования:

tests\
    sample data\
        images_to_search_for\
            moe.png
            larry.png
            curly.png
        images_to_search
            screenshot_01.png
            screenshot_02.png
        expected_results.csv

Я вручную создал файл CSV, например:

screenshot_name,moe,larry,curly
screenshot_01,True,False,True       
screenshot_02,False,False,False

Я могу создать классы или функции для загрузки этих образцов данных, но я не понимаю, как передать их моему тестовому методу.

Вот скелет моего тестового кода:

import pytest
from image_detection import search_for_image_in_image

class DataLoader(object):
    def __init__(self):
        # Load all the data up
        pass

    def get_screenshot_paths(self):
        """
        :return:  (list of string) paths to all the images to search
        """
        pass

    def get_detectable_paths(self):
        """
        :return: (list of string) paths to all the images to search for
        """
        pass

    def is_expected_to_be_found(self, screenshot_name, detectable_name):
        """
        :param screenshot_name:
        :param detectable_name:
        :return: Whether or not the detectable is expected to be found in the screenshot
        """
        pass


@pytest.mark.parametrize("screenshot_path,detectable_path,expected_result", ???? )
def test_image_searching(screenshot_path, detectable_path, expected_result):
    actual_result, _, _  = search_for_image_in_image(screenshot_path, detectable_path)

Что я положу туда, где у меня есть «????»Или я пойду по-другому?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я понял вашу точку зрения.Из вашего вопроса я понимаю, что вы хотите параметризовать методы тестирования из возвращаемого значения других функций, которые вы не можете увидеть в документах pytest.

Для этого вам нужно использовать функцию ловушки pytest (pytest_generate_tests) для параметризации методов испытаний.

    import pytest

    def pytest_generate_tests(metafunc):
        """
        This method will call before the execution of all the tests methods.
        """
        #   your logic here, to obtain the value(list data type) from any other      custom classes.
        #   for e.g:-
        data_loader = DataLoader()
        images_path  = data_loader.get_screenshot_paths()
        images_path_1 = data_loader.get_detectable_paths()
        metafunc.parametrize("first_path","seconds_path", images_path, images_path_1)
        # now, whenever this method will called by test methods, it will automatically parametrize with the above values. 



    def test_1(first_path, second_path):
        """
        Your tests method here
        """

Я надеюсь, что вы найдете свой ответ.См (https://docs.pytest.org/en/latest/parametrize.html)

0 голосов
/ 24 сентября 2019

Вам необходимо создать функцию для обработки данных

def data_provider():
    data_loader = DataLoader()
    yield pytest.param(data_loader.get_screenshot_paths(), data_loader.get_detectable_paths(), data_loader.is_expected_to_be_found('name_a', 'name_b'))

@pytest.mark.parametrize('screenshot_path, detectable_path, expected_result', data_provider())
def test_image_searching(self, screenshot_path, detectable_path, expected_result):
    actual_result, _, _  = search_for_image_in_image(screenshot_path, detectable_path)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...