2017-09-10 3 views
1

이것은 초보자 용 질문 일 뿐이지 만 실제로 제 머리카락을 내 보냅니다.unittest에서 클래스를 가져올 수 없습니다.

내가 아주 간단한 파이썬 스크립트 "foo는"이 :

$ python foo.py 
foo 

내가 기능 유닛 테스트에서 "do_something"를 검사 할이 코드를 가지고 :

#!/usr/bin/env python 

class Foo(): 
    def __init__(self): 
    self.do_something() 

    def do_something(self): 
    print "foo" 

def main(): 
    Foo() 

if __name__ == '__main__': 
    main() 

스크립트가 잘 작동 : 내가 테스트를 실행하면

#!/usr/bin/env python 

import unittest 
import foo 
from foo import * 

class TestFoo(unittest.TestCase): 
    def test_foo(self): 
    Foo() 

def main(): 
    unittest.main() 

if __name__ == "__main__": 
    main() 

그러나, 내가 얻을 :

$ python pyunit/foo.py 
E 
====================================================================== 
ERROR: test_foo (__main__.TestFoo) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "pyunit/foo.py", line 9, in test_foo 
    Foo() 
NameError: global name 'Foo' is not defined 

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

FAILED (errors=1) 

내 프로젝트 구조 :

$ tree 
. 
├── foo.py 
└── pyunit 
    └── foo.py 

내가 inspect, dir(), 파이썬 디버거 등으로 주위를 연주했지만 내가 갈 곳없는거야.

import foofrom foo import * 모두 잘 실행하고 나는 그 파일에서 가져온 기능 main를 볼 수 있지만, 클래스 자체 Foo 수입하지 않는 것.

내 목표는 궁극적으로 클래스 Foo의 함수에 대한 단위 테스트를 작성하는 것입니다.

내가 뭘 잘못하고 있니?

+0

하나의 import 문을 사용해 보았습니까? 'from foo import *'이면, 위의'import foo' 문은 필요 없습니다. – Vinny

+0

가져 오는'foo' 모듈이 원본 파일이 아닌 테스트 파일일까요? 'pyunit/foo.py'의 이름을'pyunit/test_foo.py'로 변경하고 어떻게되는지보십시오. –

+0

아니요, 나는이 제안을 모두 시도했지만 동일한 결과가 있습니다. –

답변

2

모듈에서 동일한 파일 이름 (foo.py)을 사용하면 안됩니다. 대신 test_foo로 테스트 모듈을 변경하십시오. 암시 적 암시 적보다 낫습니다. 부모 디렉토리에서 모듈을 가져올 때 from <parent_dir> import foo

을 명시해야 귀하의 경우 있도록

, 당신은 당신의 모듈이 sys.path의 일부가 아닌 becuase 당신은 ImportError: No module named foo 오류가 발생, from <parent_dir> import <module_name>를 사용해야합니다.

가장 간단한 방법은 파이썬의 검색 경로에 로컬 디렉토리를 가져올 수 :

import sys 
sys.path.append('.') 

을 다른 import 문 전에. 이렇게하면 프로젝트 디렉토리가 경로에 추가됩니다. 동일한 이름을 가진 클래스가 여러 개있는 경우 sys.path.insert(0, '.')을 사용하여 경로를 첫 번째 위치로 푸는 것이 더 좋습니다

+0

아니요, 작동하지 않는 것 같습니다. 이로 인해 'ImportError : pyUNit' 모듈이 없습니다.'라는 오류가 발생합니다. –

+0

pyunit 폴더에'__init __. py'라는 이름의 새로운 빈 파일을 추가하면 파이썬이 패키지로 폴더를 주소 지정합니다. – Vinny

+0

Nope. 차이 없음. –

1

특히 상대적 가져 오기를 사용하면 Python 테스트가 불안정 할 수 있습니다. 그래서 나는 해결해야 할 일이있다.

첫 번째와 가장 먼저 : pytest을 설치하면 sys.path에 테스트 모듈이 포함되어있는 이름이 확인됩니다. pip install pytest을 실행하여 설치하십시오.상대적으로 수입

, 당신은 당신이 제거했는지 확인하십시오 그

from ..foo import Foo 

인이 사용에게 수입의 표현을 해결하기 위해, 테스트 패키지 외부 모듈에 액세스하려고 import foo

그런 다음 테스트 pytest 또는 pytest test_foo.py (pyunit 폴더에있는 경우)을 실행 해보십시오.

관련 문제