$ py.test test_factorial.py
$ py.test path_to_test
$ py.test -k string_expression

앞의 두 줄은 직관적으로 해당 경로의 테스트를 수행하라는 것임을 알 수 있다. 한편 세 번째 줄은 내부적으로 string expression을 evaluate해서 해당 조건을 만족하는 테스트만 수행하라는 명령인데, 예를 들어 “MyClass and not method” 라고 지정할 경우 TestMyClass.test_something은 수행되지만 TestMyClass.test_method_simple은 수행되지 않는다.

$ py.test test_factorial.py::test_fact_zero

또, 이렇게 특정한 테스트 함수만 수행하도록 지정할 수도 있다.

$ py.test --pyargs pkg

한편 이렇게 하면 pkg라는 package가 import 가능한 python 모듈일 경우 해당하는 경로를 찾은 다음 그 경로 내에 있는 모든 테스트를 수행한다.

$ py.test -x
$ py.test --maxfail=2

첫 번째 -x의 경우에는 한 개의 테스트가 실패할 경우 바로 종료하도록 하는 옵션이고, 두 번째 –maxfail=2는 테스트가 두 개 실패할 경우 바로 종료하도록 하는 옵션이다.

$ py.test --durations=10

이것 역시 중요한 명령어인데, 가장 수행시간이 길었던 열 개의 테스트를 출력하는 명령어이다.

$ py.test -s

이걸 안 하면 stdout이 capture 안된다? 작성해야됨

$ py.test --version
$ py.test --help | -h
$ py.test --markers
$ py.test --fixtures

나머지는 익숙한 옵션이고, markers와 fixtures는 pytest 기본 fixture들을 보여준다. 예를 들어 tmpdir은 유일한 임시 공간의 경로를 나타내는 fixture다. 그리고 markers는 pytest를 import하면 기본적으로 사용 가능한 decorator들을 보여준다.

이 외에도 debugging이나 logging을 위한 여러 명령어-심지어 pastebin에 테스트 로그를 올려주는 기능도 있다-가 있지만 그건 다음에 다뤄보고, 지금은 매번 치기 귀찮은 명령어들을 기본값으로 지정하는 방법을 알아보자.

$ cat << EOF > pytest.ini
[pytest]
addopts = -rsxX -q
EOF
$ py.test # py.test -rsxX -q

이건 현재 디렉토리 및 pytest.ini가 없는 하위 디렉토리에만 영향을 주는 pytest.ini 파일을 만드는 것이다.

$ export PYTEST_ADDOPTS="-rsxX -q"
$ py.test # py.test -rsxX -q

한편 이렇게 환경 변수를 통해 유저 설정 전체를 바꿔버릴 수도 있다. 자세한건 pytest.ini을 참조.

그리고 까먹을 뻔 했는데, 물론 pytest를 명령줄이 아닌 python 코드로 실행하는 것 역시 가능하다.

# 명령줄과 거의 똑같다.
pytest.main()
pytest.main(['-x', 'mytestdir'])
pytest.main('-x mytestdir')

class MyPlugin:
  def pytest_sessionfinish(self):
    print("*** test run reporting finishing")
pytest.main("", plugins=[MyPlugin()]) # 추가적인 plugin을 이용한다. 이 예제에서는 MyPlugin을 hook으로 추가한다.