programing

모수 크기의 인수로 고정 장치를 사용한 파이 검정

css3 2023. 7. 24. 22:42

모수 크기의 인수로 고정 장치를 사용한 파이 검정

저는 고정 장치를 의 주장으로 사용하고 싶습니다.pytest.mark.parametrize아니면 같은 결과를 가져올 수도 있습니다.

예:

import pytest
import my_package

@pytest.fixture
def dir1_fixture():
    return '/dir1'

@pytest.fixture
def dir2_fixture():
    return '/dir2'

@pytest.parametrize('dirname, expected', [(dir1_fixture, 'expected1'), (dir2_fixture, 'expected2')])
def test_directory_command(dirname, expected):
    result = my_package.directory_command(dirname)
    assert result == expected

고정 장치 매개 변수의 문제는 고정 장치의 모든 매개 변수가 사용될 때마다 실행된다는 것입니다. 하지만 저는 그것을 원하지 않습니다.저는 시험에 따라 어떤 고정장치를 사용할지 선택할 수 있기를 원합니다.

윌이 올바른 길을 가고 있었으니, 당신은 이를 이용해야 합니다.request.getfixturevalue고정 장치를 회수합니다.

하지만 테스트에서 바로 할 수 있습니다. 더 간단합니다.

@pytest.mark.parametrize('dirname, expected', [
    ('dir1_fixture', 'expected1'),
    ('dir2_fixture', 'expected2')])
def test_directory_command(dirname, expected, request):
    result = my_package.directory_command(request.getfixturevalue(dirname))
    assert result == expected

또 다른 방법은 레이지 픽스처 플러그인을 사용하는 것입니다.

@pytest.mark.parametrize('dirname, expected', [
    (pytest.lazy_fixture('dir1_fixture'), 'expected1'),
    (pytest.lazy_fixture('dir2_fixture'), 'expected2')])
def test_directory_command(dirname, expected):
    result = my_package.directory_command(dirname)
    assert result == expected

Pytest 3.0 이상을 사용하는 경우 다음을 사용하여 고정 장치를 작성하여 이 특정 시나리오를 해결할 수 있어야 합니다.

@pytest.fixture(params=['dir1_fixture', 'dir2_fixture'])
def dirname(request):
    return request.getfixturevalue(request.param)

그러나 동적으로 로드하려는 고정장치가 매개변수화된 경우에는 이 방법을 사용할 수 없습니다.

대신에, 당신은 무언가를 알아낼 수 있을 것입니다.pytest_generate_tests훅. 하지만 그 정도는 조사할 마음이 나지 않았습니다.

이것은 현재 파이테스트에서 지원되지 않습니다.하지만 2013년에 오픈된 오픈 기능 요청이 있습니다.

현재로서는 고정장치 사전을 반환하는 고정장치를 만드는 것이 유일한 해결책입니다.

import pytest
import my_package

@pytest.fixture
def dir1_fixture():
    return '/dir1'

@pytest.fixture
def dir2_fixture():
    return '/dir2'

@pytest.fixture
def dir_fixtures(
    dir1_fixture,
    dir2_fixture
    ):
    return {
        'dir1_fixture': dir1_fixture,
        'dir2_fixture': dir2_fixture
    }

@pytest.mark.parametrize('fixture_name, expected', [('dir1_fixture', 'expected1'), ('dir2_fixture', 'expected2')])
def test_directory_command(dir_fixtures, fixture_name, expected):
    dirname = dir_fixtures[fixture_name]
    result = my_package.directory_command(dirname)
    assert result == expected

파이테스트에 내장된 솔루션을 사용하지 않기 때문에 최고는 아니지만, 저에게는 효과가 있습니다.

서로 다른 두 개의 파라메타라이징 고정장치 대신 하나의 파라메타라이징 고정장치를 사용한 다음indirect.

import pytest
import my_package

@pytest.fixture
def dirname(request):
    return request.param
   
    
@pytest.mark.parametrize(
    'dirname, expected', 
    [('/dir1', 'expected1'), ('/dir2', 'expected2')], 
    indirect=['dirname']
)
def test_directory_command(dirname, expected):
    result = my_package.directory_command(dirname)
    assert result == expected

이 경우 요청을 사용하여 고정장치를 매개변수화합니다(간접 매개변수 덕분).expected단순한 매개 변수일 뿐입니다.

이것은 주제에서 벗어난 것일 수도 있지만, 저는 전체 디어를 읽는 방법을 알아내려고 여기에 왔습니다.데이터 파일을 테스트하고 하나씩 고정 장치로 실행합니다.그래서 만약 당신이 폴더에 모든 dir를 가지고 있다면 이렇게 말합니다.test/examples다음과 같은 작업을 수행할 수 있습니다.

import pytest
from pathlib import Path

@pytest.fixture(
    # I guess this is anything that generates a list
    # Make it a list of tuples if you want results as well, or JSON?
    params=[str(p) for p in Path("test/examples").glob("*") if p.is_dir()]
)
def dirname(request):
    return request.param

def test_directory_command(dirname):  # dirname will be enumerated
    result = my_package.directory_command(dirname)
    assert ...

문서를 확인합니다.

테스트 실행 중에 고정 장치 파라미터를 변경하지 마십시오.

잘못된 예: @pytest.고정 장치(scope="class", params=other_params)

이제 작동하지 않는 이유를 설명하겠습니다.

  1. Pytest는 테스트를 실행하기 전에 테스트를 실행하는 데 사용할 매개 변수를 포함하는 세션 개체를 만듭니다.테스트를 실행하는 동안에는 파라미터를 변경할 수 없습니다.

  2. 매개 변수를 동적으로 변경하려면 중간 텍스트 파일 "params.txt"를 사용할 수 있습니다.예: @pytest.fixture(scope="class", params=json.load(open("txt.txt"))).파일을 변경하면 파일 내용이 테스트에 표시되지 않기 때문에 테스트 중에는 파일 내용을 변경할 수 없습니다.이렇게 하려면 프로그램이 시작될 때와 세션 개체가 생성되기 전에 파일의 내용을 변경해야 합니다.이렇게 하려면 conftest.py 에서 파일 내용을 변경하는 method pytest_sysstart(method)를 정의합니다.

  3. 자세한 내용은 다음 설명서를 참조하십시오.모든 클래스에서 모든 테스트 전에 메소드를 실행하는 방법은 무엇입니까?https://docs.pytest.org/en/6.2.x/reference.html#pytest.hookspec.pytest_sessionstart .

언급URL : https://stackoverflow.com/questions/42014484/pytest-using-fixtures-as-arguments-in-parametrize