2014-07-19 10 views
1

파이썬의 unittest 모듈을 사용하여 작성된 unittest 세트가 있습니다. 그들은 setUpModule() 함수를 사용하여 테스트를 실행하는 데 필요한 공유 된 "stuff"(일부 http 세션 포함)로 전역 변수를로드합니다.글로벌 비품을 가지고있을 때 python unittests를 py.test로 변환하는 방법은 무엇입니까?

unittest으로 테스트를 실행하면 py.test으로 정상적으로 실행되지만 테스트에 실패합니다.

필자는 이전의 pytest fixture 함수 (unittest와 동일한 이름을 가지지 않음)를 사용하여 실행되도록 패치했습니다. 여러 스레드에서 실행되지 않는 경우에만 작동하지만, 그 기능을 사용하고 싶습니다.

필자의 경우 20 개 클래스 (unittest.TestCase)와 각 클래스 내에 10 개의 테스트가 있으므로 문서 예제는 쓸모가 없습니다. 분명히 나는 ​​각 테스트에 새로운 매개 변수를 추가하고 싶지 않습니다.

지금까지는 클래스 setUp() 메서드를 사용하여 self 내부에 공유 디코딩을로드하고 각 테스트 내부에이 메서드를 사용했습니다.

#!/usr/bin/env python 
# conftest.py 
@pytest.fixture(scope="session") 
def manager(): 
    return { "a": "b"} 

그리고 지금 시험 :

#!/usr/bin/env python 
# tests.py 

class VersionTests(unittest.TestCase): 

    def setUp(self): 
     self.manager = manager 

    def test_create_version(self): 
     # do something with self.manager 
     pass 

나는 고정을 한 시간을 호출, 다중 스레드로 작업 할 수있는 솔루션이 필요하다는 것을 기억하시기 바랍니다.

답변

3

pytest은 시험을 실행할 수 있습니다 (Support for unittest.TestCase/Integration of fixtures 참조). 까다로운 부분 직접 pytest funcargs fixtures을 사용하는 것은 권장되지이다 :

즉 입힐 가능성 구현 비 유닛 테스트 테스트 방법의 테스트 함수 인수를 통해기구를 수신 pytest 지지체가 unittest.TestCase 방법 직접 조명기 함수 인수를 수신 할 수는 없지만 일반적인 unittest.TestCase 테스트 스위트를 실행할 수 있는지 여부.

# test_unittest_tests.py (for the sake of clarity!) 
import unittest 

manager = None 

def setUpModule(): 
    global manager 
    manager = {1: 2} 

class UnittestTests(unittest.TestCase): 
    def setUp(self): 
     self.manager = manager 

    def test_1_in_manager(self): 
     assert 1 in self.manager 

    def test_a_in_manager(self): 
     assert 'a' in self.manager 

그것은 unittest으로 실행했을 때 다음과 같은 출력을 산출한다 : :이 test_a_in_manager과 같이 실패

$ python -m unittest -v test_unittest_tests 
... 
test_1_in_manager (test_unittest_tests.UnittestTests) ... ok 
test_a_in_manager (test_unittest_tests.UnittestTests) ... FAIL 
... 

생각에는 우리는 표준 unittest 초기화 기능을 사용하여이 같은 테스트 모듈이 예상 한대로 manager 디렉토리에는 'a' 키가 없습니다.

우리는 conftest.py를 설정하여이 테스트에 범위가 지정된 pytest 픽스처를 제공합니다. 예를 들어 이와 같이, pytest autouse를 사용하여 표준 unittest 동작을 깨지 않고 모든에서 그들에게 시험을 터치 할 필요없이 : pytest는 병렬화에 대한 (pytest-xdist 사용)

# conftest.py 
import pytest 

@pytest.fixture(scope='session', autouse=True) 
def manager_session(request): 
    # create a session-scoped manager 
    request.session.manager = {'a': 'b'} 

@pytest.fixture(scope='module', autouse=True) 
def manager_module(request): 
    # set the sessions-scoped manager to the tests module at hand 
    request.module.manager = request.session.manager 

박차 테스트, 다음과 같은 출력을 얻을 수 :

$ py.test -v -n2 
... 
[gw1] PASSED test_unittest_tests.py:17: UnittestTests.test_a_in_manager 
[gw0] FAILED test_unittest_tests.py:14: UnittestTests.test_1_in_manager 
... 

이제는 test_1_in_manager이 실패하고 pytest 제공 관리자 사전에 1 키가 없습니다.