2017-09-17 5 views
1

일부 디버깅 (특히 pytest/testing/test_doctest.py)을 시도하고 있는데 IPython의 일부 코드를 단계별로 실행하려고합니다. 나는 파이 테스트 (pytest)에 대한 경험이 있지만, 결코 그걸 좋아하지 않는다. 그래서 나는 그것이하는 "마술"에 깊이 빠뜨리지 않았다._pytest.pytester.Testdir 인스턴스를 생성하는 방법

테스트 할 때 (일부 개체를 조사 할 가능성이 있음) testdir이라는 인수가 있지만이 파일의 아무 곳에서도 testdir이 무엇인지 또는 어떻게 구성 할 수 있는지는 알 수 없습니다.

일부 파기를 한 후에는 pytester 플러그인을 사용하여 pytest를 실행할 때 자동으로 생성되어 매개 변수로 함수에 전송되는 마술 픽스쳐 인 것 같습니다. 그 클래스를 추적 할 때, 어떤 마법을 통해 다시 구축됩니다. request param. 코드는 그 마법의 진수를 알려주는데 도움이되지 않습니다. request 또는 만드는 법.

는 단순히 이와 같은 시험을 할이 콘크리트 만들려면 :

def test_reportinfo(self, testdir): 
    ''' 
    Test case to make sure that DoctestItem.reportinfo() returns lineno. 
    ''' 
    p = testdir.makepyfile(test_reportinfo=""" 
     def foo(x): 
      ''' 
       >>> foo('a') 
       'b' 
      ''' 
      return 'c' 
    """) 
    items, reprec = testdir.inline_genitems(p, '--doctest-modules') 
    reportinfo = items[0].reportinfo() 
    assert reportinfo[1] == 1 

을하고 IPython에서의 로직을 실행합니다. testdir 개체가 무엇인지 살펴보면 매우 멋지게 보입니다. 자동으로 파일을 만들고 명령 줄 대신 pytest를 문제없이 실행합니다. 이 중 하나를 어떻게 만들 수 있습니까? 제가 이것을 놓친 문서가 있습니까? 명확하지 않고 덜 모호하게 보입니다.

만약 내가 이런 식으로 사용하고 싶다면 내 검사는 마법 testdir 매개 변수가 약간 더 명백해 지도록 할 수있는 방법이있다. 그래서 나는 다음 코더가 그것을 보았다. 오전?

답변

0

많은 고민 끝에, 조명기 값을 인스턴스화하는 방법을 알아 냈습니다.

import _pytest 
    config = _pytest.config._prepareconfig(['-s'], plugins=['pytester']) 
    session = _pytest.main.Session(config) 
    _pytest.tmpdir.pytest_configure(config) 
    _pytest.fixtures.pytest_sessionstart(session) 
    _pytest.runner.pytest_sessionstart(session) 

    def func(testdir): 
     return testdir 

    parent = _pytest.python.Module('parent', config=config, session=session) 
    function = _pytest.python.Function(
     'func', parent, callobj=func, config=config, session=session) 
    _pytest.fixtures.fillfixtures(function) 
    testdir = function.funcargs['testdir'] 

주요 아이디어는 더미 pytest 세션을 만드는 것입니다. 이것은 조금 까다 롭습니다. 그 '-' '가 _prepareconfig에 전달되는 것이 중요합니다. 그렇지 않으면 stdout을 출력하지 않거나 IPython에서 실행할 때 충돌이 발생합니다.

베어 본 설정과 세션이 주어지면 다음 단계는 사용할 조명기 기능을 수동으로로드하는 것입니다. 이것은 pluggy가 보통 당신을 위해 돌보는 고리를 수동으로 호출하는 것입니다. 나는 그것들을 사용하지 않고 코드를 실행할 때 나는 속성 에러를 보았다. 일반적으로 세션 또는 구성에 필요한 속성이 부족하기 때문입니다. 이를 수행하는 데 더 좋은 방법이있을 수 있습니다 (예 : pluggy를 통해 자동으로 알 수 있음).

다음으로 관심있는 특정 조명기를 요청하는 함수를 만듭니다.이 이름이 무엇인지 알기까지합니다. 마지막으로 더미 모듈/함수 트리 구조를 설정하고 마법을 수행하는 fillfixtures를 호출합니다. 그런 다음 funcargs에는 사용할 수있는 이러한 개체의 사전이 포함됩니다. 분해 (teardown) 기능을 원한다면 조심하십시오. 이 문제를 다루는 지 확실하지 않지만, 내가하고있는 일을 위해 실제로 필요하지 않습니다.

다른 사람에게 도움이되기를 바랍니다. 참고 :이 이야기는 내가 더 나은 두건 아래의 pytest에서 일어난 일을 이해하는 데 도움이되었습니다. https://www.youtube.com/watch?v=zZsNPDfOoHU