repl.it에서 PyTest 작동시키기

이것은 repl.it 환경 내에서 PyTest를 실행하는 방법에 대한 매우 짧은 안내서입니다. repl.it 인스턴스에서 PyTest를 작동시키려고 할 때 내가 처리한 몇 가지 문제를 다룹니다. 이 기사의 목적을 위해 test_main.py 라는 이름의 아래 4줄 스크립트를 사용합니다.

간단한 테스트하기



Pytest는 파일 이름과 기능을 확인합니다. "test"로 시작하는 모든 항목은 pytest를 실행할 대상입니다.
test_main.py라는 파일을 만듭니다.

두 가지 주장을 작성하세요. 아무 것도 생각나지 않으면 아래 내용을 복사하세요.

def test_one_equals_one():
  assert 1 == 1

def test_one_does_not_equal_two():
  assert 1 != 2


repl.it에서 PyTest 사용



[2022년 4월 1일부터 참]

테스트가 명령줄에서 호출pytest만큼 간단한 가이드를 우연히 발견했을 수 있습니다.

그러나 repl.it에서 그렇게 하면 아래와 같은 오류가 발생합니다.

$ pytest
/usr/bin/env: ./python3: No such file or directory


이 오류는 아래와 같이 repl.it이 가상 환경 내에서 인스턴스를 인스턴스화하기 때문에 발생합니다.

~/ImperfectGaseousLocks$ which python
/home/runner/ImperfectGaseousLocks/venv/bin/python


pip가 pytest를 설치한 위치를 봅시다...

~/ImperfectGaseousLocks$ which pytest
/home/runner/ImperfectGaseousLocks/venv/bin/pytest


나 한테보기 좋다! 그렇다면 왜 pytest는/usr/bin/env에서 파이썬을 호출하려고 시도할까요? 올바른 Python을 사용하여 pytest를 어떻게 호출합니까?

경로 문제



결과적으로 pytest에는 #!/usr/bin/env 셔뱅이 있습니다. pytest 를 호출하면 호출 순서가 다음과 같이 됩니다.
  • /home/runner/ImperfectGaseousLocks/venv/bin/pytest 호출됨
  • pytest가 시스템에 사용하도록 지시함#!/usr/bin/env
  • /usr/bin/env./python3가 없으므로

  • 솔루션 1



    테스트 파일이 있는 디렉토리에서 python -m pytest를 사용하십시오.

    the Python documentation으로 이동하면 "인터페이스 옵션"에서 확인할 수 있습니다.

    -m <module-name>
    Search sys.path for the named module and execute its contents as the __main__ module.
    
    Since the argument is a module name, you must not give a file extension (.py). The module name should be a valid absolute Python module name, but the implementation may not always enforce this (e.g. it may allow you to use a name that includes a hyphen).
    
    Package names (including namespace packages) are also permitted. When a package name is supplied instead of a normal module, the interpreter will execute <pkg>.__main__ as the main module. This behaviour is deliberately similar to the handling of directories and zipfiles that are passed to the interpreter as the script argument.
    
    Note This option cannot be used with built-in modules and extension modules written in C, since they do not have Python module files. However, it can still be used for precompiled modules, even if the original source file is not available.
    If this option is given, the first element of sys.argv will be the full path to the module file (while the module file is being located, the first element will be set to "-m"). As with the -c option, the current directory will be added to the start of sys.path.
    
    -I option can be used to run the script in isolated mode where sys.path contains neither the current directory nor the user’s site-packages directory. All PYTHON* environment variables are ignored, too.
    
    Many standard library modules contain code that is invoked on their execution as a script. An example is the timeit module:
    
    python -m timeit -s 'setup here' 'benchmarked code here'
    python -m timeit -h # for details
    


    영어로 -m 를 사용하면 Python이 스크립트로 실행할 PyTest를 가져옵니다. 이렇게 하면 상대 가져오기가 예상대로 작동하므로 PyTest도 작동해야 합니다.

    이를 통해 python은 pytest를 보고 pytest는 shebang 라인을 무시하고 성공적으로 실행합니다.

    ~/ImperfectGaseousLocks$ python -m pytest
    ==================================== test session starts ====================================
    platform linux -- Python 3.8.12, pytest-7.1.1, pluggy-0.13.1
    rootdir: /home/runner/ImperfectGaseousLocks
    collected 2 items                                                                           
    
    test_main.py ..                                                                       [100%]
    
    ===================================== 2 passed in 0.14s =====================================
    


    솔루션 2



    pytest 스크립트의 shebang 부분을 변경하십시오!

    오류는 정확히 무엇이 잘못되었는지 알려줍니다. "./python3"라는 파일이 존재하지 않습니다. 그러나 존재하는 것은 "python3"이라는 파일이므로 이를 수정해 보겠습니다.
  • ~/ImperfectGaseousLocks$ vim venv/bin/pytest
  • i를 눌러 삽입 모드
  • /usr/bin/env ./python3/usr/bin/env python3로 변경
  • esc를 눌러 삽입 모드를 종료합니다
  • .
  • :x 해당 스크립트를 종료하고 저장하려면
  • 테스트가 있는 디렉토리에서 pytest만 다시 실행해 보십시오.

  • ~/ImperfectGaseousLocks$ pytest -v
    ==================================== test session starts ====================================
    platform linux -- Python 3.8.12, pytest-7.1.1, pluggy-0.13.1 -- /home/runner/ImperfectGaseousLocks/venv/bin/python3
    cachedir: .pytest_cache
    rootdir: /home/runner/ImperfectGaseousLocks
    collected 2 items                                                                           
    
    test_main.py::test_one_equals_one PASSED                                              [ 50%]
    test_main.py::test_one_does_not_equal_two PASSED                                      [100%]
    
    ===================================== 2 passed in 0.12s =====================================
    


    성공!

    PATH 문제는 탐색하기에 악몽이 될 수 있으며 우리 모두는 때때로 이와 같은 어리석은 문제에 직면하게 됩니다.

    질문이 있으시면 댓글을 달아주세요.

    이것은 내 첫 번째 기술 블로그 게시물입니다. 나는 건설적인 비판을 환영하며 경험 수준에 관계없이 누구에게나 배울 수 있습니다. 안녕!

    좋은 웹페이지 즐겨찾기