파일에서 실행할 pytest 테스트를 지정하는 방법이 있습니까?


190

pytest파일에서 실행할 테스트 를 선택하는 방법이 있습니까? 예를 들어, foo.txt실행할 테스트 목록이 들어있는 파일 은 다음과 같습니다.

tests_directory/foo.py::test_001
tests_directory/bar.py::test_some_other_test

또는 pytest가있는 다른 디렉토리에서 테스트 이름에 공통 패턴이없는 여러 테스트를 선택할 수 있습니까?

pytest -k <pattern> 단일 패턴을 허용합니다.

하나의 옵션은 pytest.mark각 테스트마다 반대하는 것이지만 필자의 요구 사항은 다른 파일에서 다른 테스트 조합을 실행해야합니다.

각 패턴에 대해 여러 패턴과 테스트 파일 이름을 지정하는 방법이 있습니까?

또는

파일에서 정확한 테스트 경로를 지정하고 해당 파일을 입력으로 공급하는 방법이 pytest있습니까?

또는

이 목적으로 활용할 수있는 후크 기능이 있습니까?

답변:


231

-k옵션 을 사용 하여 다른 패턴으로 테스트 케이스를 실행할 수 있습니다 .

py.test tests_directory/foo.py tests_directory/bar.py -k 'test_001 or test_some_other_test'

이름이 test_001test_some_other_test 인 테스트 케이스가 나머지 테스트 케이스를 선택 취소하여 실행됩니다 .

참고 : test_001 또는 test_some_other_test로 시작하는 테스트 사례가 선택됩니다 . 예를 들어, 테스트 케이스 test_0012 가있는 경우 에도 선택됩니다.


1
감사. 그러나 foo.py와 bar.py (예 : test_001)에 같은 이름의 테스트가 있으면 둘 다에서 실행됩니다.
Sharad

2
예, 패턴과 일치하는 것은 노트에서 언급 한대로 실행됩니다.
supamaze

그러나 그것은 저에게 문제입니다. 어떤 파일에서 실행할 테스트를 선택하고 싶습니다.
Sharad

@NamGVU`-k <test method name>`
supamaze

4
그것은해야한다py.test path/to/test/file.py -k function_name_test
LittleZero

91

테스트 지정 / 테스트 선택

Pytest는 명령 줄에서 테스트를 실행하고 선택하는 여러 가지 방법을 지원합니다.

모듈에서 테스트 실행

pytest test_mod.py

디렉토리에서 테스트 실행

pytest testing/

키워드 표현식으로 테스트 실행

pytest -k "MyClass and not method"

주어진 문자열 표현식과 일치하는 이름이 포함 된 테스트를 실행합니다. 여기에는 파일 이름, 클래스 이름 및 함수 이름을 변수로 사용하는 Python 연산자가 포함될 수 있습니다. 위의 예제는 실행 TestMyClass.test_something되지만 실행 되지는 않습니다 TestMyClass.test_method_simple.

노드 ID별로 테스트 실행

수집 된 각 테스트 nodeid에는 모듈 이름과 클래스 이름, 함수 이름 및 매개 변수 매개 변수와 같은 지정자가 ::문자로 구분되어 구성됩니다 .

모듈 내에서 특정 테스트를 실행하려면

pytest test_mod.py::test_func

명령 행에서 테스트 방법을 지정하는 다른 예 :

pytest test_mod.py::TestClass::test_method

마커 표현식으로 테스트 실행

pytest -m slow

@pytest.mark.slow데코레이터 로 장식 된 모든 테스트를 실행합니다 .

자세한 내용은 표시를 참조하십시오 .

패키지에서 테스트 실행

pytest --pyargs pkg.testing

pkg.testing파일 시스템 위치를 가져 와서 사용하여 테스트를 찾아 실행합니다.

출처 : https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests


test_mod.py::TestClass::test_method가 저에게 가장 효과적이었습니다
StephenGodderidge

1
허용 된 anser로 표시해야합니다
Adam Hughes

13

두 개의 다른 클래스에 동일한 메소드 이름이 있고 그 중 하나를 실행하려는 경우 다음과 같이 작동합니다.

pytest tests.py -k 'TestClassName and test_method_name'

6

방법 1 : 무작위로 선택된 테스트. 길고 못생긴.

python -m pytest test/stress/test_performance.py::TestPerformance::test_continuous_trigger test/integration/test_config.py::TestConfig::test_valid_config

방법 2 : 키워드 표현식 사용.

참고 : 테스트 케이스 이름으로 검색하고 있습니다. TestClass 이름에도 동일하게 적용됩니다.

사례 1 : 아래에서 찾은 것이 실행됩니다. 우리는 'OR'을 사용했기 때문에.

python -m pytest -k 'test_password_valid or test_no_configuration'

위의 두 가지가 실제로 정확하다고 가정하면 두 가지 테스트가 실행됩니다.

사례 2 : 이제 잘못된 이름과 다른 올바른 이름입니다.

python -m pytest -k 'test_password_validzzzzzz or test_no_configuration' 

하나만 발견되어 실행됩니다.

사례 3 : 모든 테스트를 실행하거나 아무도 원하지 않으면 AND를 사용하십시오.

python -m pytest -k 'test_password_valid and test_no_configuration'

둘 다 정확하거나 없으면 실행됩니다.

사례 4 : 한 폴더에서만 테스트를 실행하십시오.

python -m pytest test/project1/integration -k 'test_password_valid or test_no_configuration'

사례 5 : 하나의 파일에서만 테스트를 실행하십시오.

python -m pytest test/integration/test_authentication.py -k 'test_password_expiry or test_incorrect_password'

사례 6 : 일치 항목을 제외한 모든 테스트를 실행하십시오.

python -m pytest test/integration/test_authentication.py -k 'not  test_incorrect_password'

1

노드 ID로 테스트 실행에 대한 문서에 따르면

foo.txt에 모든 노드 ID가 있으므로 실행하십시오.

pytest `cat foo.txt | tr '\n' ' '`

이것은 아래 명령과 같습니다 (문제에 파일 내용이 있음)

pytest tests_directory/foo.py::test_001 tests_directory/bar.py::test_some_other_test

1

내 대답은 다른 시나리오에서 테스트의 하위 집합을 실행하는 방법을 제공합니다.

프로젝트에서 모든 테스트 실행

pytest

단일 디렉토리에서 테스트 실행

한 디렉토리에서 모든 테스트를 실행하려면 다음 디렉토리를 매개 변수로 사용하십시오 pytest.

pytest tests/my-directory

단일 테스트 파일 / 모듈에서 테스트 실행

테스트로 가득 찬 파일을 실행하려면 상대 경로가있는 파일을 매개 변수로 pytest다음에 나열하십시오 .

pytest tests/my-directory/test_demo.py

단일 테스트 기능 실행

단일 테스트 기능을 실행하려면 다음 ::과 같이 테스트 기능 이름을 추가하십시오 .

pytest -v tests/my-directory/test_demo.py::test_specific_function

-v 어떤 기능이 실행되었는지 확인할 수 있습니다.

단일 테스트 클래스 실행

클래스 만 실행하려면 함수를 사용하여 수행 한 것처럼하고 ::, 클래스 이름을 파일 매개 변수에 추가하십시오.

pytest -v tests/my-directory/test_demo.py::TestClassName

테스트 클래스의 단일 테스트 메소드 실행

모든 테스트 클래스를 실행하지 않으려면 한 메소드 만 실행하고 다른 ::메소드와 메소드 이름을 추가하십시오 .

pytest -v tests/my-directory/test_demo.py::TestClassName::test_specific_method

테스트 이름을 기준으로 테스트 세트 실행

-k옵션을 사용하면 표현식에 특정 이름이 지정된 테스트 이름의 하위 문자열로 지정된 테스트를 실행하기 위해 표현식을 전달할 수 있습니다. 사용하는 것이 가능 하고 , 또는 , 그리고 하지 복잡한 식을 만들 수 있습니다.

예를 들어, 이름에 _raises가있는 모든 함수를 실행하려면 다음을 수행하십시오.

pytest -v -k _raises


0

다음은 가능한 부분 답변입니다. 해당 스크립트 내의 개별 테스트가 아닌 테스트 스크립트 만 선택할 수 있기 때문입니다.

또한 레거시 호환성 모드 대 unittest스크립트를 사용하여 제한 했기 때문에 네이티브 pytest와 작동한다고 보장하지 않습니다.

간다 :

  1. 새로운 사전을 만듭니다 (예 :) subset_tests_directory.
  2. ln -s tests_directory/foo.py
  3. ln -s tests_directory/bar.py

  4. 파일이 암시 적으로 있다고 가정하는 가져 오기에주의하십시오 test_directory. python foo.py내부에서 실행 subset_tests_directory하고 필요에 따라 수정하여 몇 가지를 수정 해야했습니다.

  5. 테스트 스크립트되면 그냥 제대로 실행 cd subset_tests_directory하고 pytest있다. Pytest는 보이는 스크립트 만 선택합니다.

또 다른 가능성은 현재 테스트 디렉토리에 심볼릭 링크되어, 같은 말을 ln -s foo.py subset_foo.py한 후 pytest subset*.py. 가져 오기를 조정할 필요는 없지만 심볼릭 링크를 제거 할 때까지 혼란을 초래할 수 있습니다. 나를 위해 일했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.