I. 서문 : 응용 프로그램 디렉토리 구조 및 모듈이 게시물의 끝에 나열됩니다.패키지 가져 오기 오류로 Python 실행 Unittest
II. 문제 문 : PYTHONPATH가 설정되어 있지 않으면 응용 프로그램이 실행되지만 unittest가 으로 실패합니다. ImportError : 모듈이 models.transactions가 아닌입니다. 이것은 거래를 app.py에서 가져 오려고 할 때 발생합니다. PYTHONPATH가 /sandbox/app
으로 설정된 경우 응용 프로그램과 unittest가 오류없이 실행됩니다. 솔루션에 대한 제약 조건은 PYTHONPATH가 설정되어서는 안되며 sys.path를 프로그래밍 방식으로 수정하면 안됩니다.
III. 세부 정보 : PYTHONPATH가 설정되고 test_app.py
이 패키지 /sandbox$ python -m unittest tests.test_app
으로 실행되는 경우를 고려하십시오. 코드 전체에 뿌려 __main__
의 인쇄 문에서 상대 :
models : app.models.transactions
models : models.transactions
resources: app.resources.transactions
app : app.app
test : tests.test_app
유닛 테스트에 먼저 응용 프로그램을 가져오고하는 것은 너무 app.models.transactions
있다. 앱 의 다음 가져 오기 시도는 resources.transactions
입니다. 가져올 때 models.transactions
을 가져오고 을 입력하면 __name__
은 app.resources.transactions
입니다. 그 다음에 app.app
가져 오기가 이어지고 마지막으로 unittest 모듈 tests.test.app
이옵니다. PYTHONPATH를 설정하면 응용 프로그램이 models.transactions를 확인할 수 있습니다!
하나의 해결책은 models.transactions
을 resources.transaction
안에 넣는 것입니다. 그러나 문제를 해결할 다른 방법이 있습니까?
models : models.transactions
resources: resources.transactions
app : __main__
이 예상되며, 더 수입은 /sandbox/app
또는 옆 위에있는 시도되고 있지 : 응용 프로그램이 __main__
의 인쇄 문을 실행
이 있습니다.
IV. 부록
A.1 디렉토리 구조 :
|-- sandbox
|-- app
|-- models
|-- __init__.py
|-- transactions.py
|-- resources
|-- __init__.py
|-- transactions.py
|-- __init__.py
|-- app.py
|-- tests
|-- __init__.py
|-- test_app.py
A.2 모듈 :
(1) 응용 프로그램 :
from flask import Flask
from models.transactions import TransactionsModel
from resources.transactions import Transactions
print ' app : ', __name__
def create_app():
app = Flask(__name__)
return app
app = create_app()
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
(2) models.transactions
print ' model : ', __name__
class TransactionsModel:
pass
(3) resources.transactions :
from models.transactions import TransactionsModel
print ' resources: ', __name__
class Transactions:
pass
(4) 테스트.test_app
import unittest
from app.app import create_app
from app.resources.transactions import Transactions
print ' test : ', __name__
class DonationTestCase(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_transactions_get_with_none_ids(self):
self.assertEqual(0, 0)
if __name__ == '__main__':
unittest.main()
"그것이 효과가있다"는 사실은이 코드가 "읽기 쉽지 않다"는 사실에 대해 가중되어야합니다. 즉, 다른 사람들은 코드를 유지 관리하는 사람들이 여기에서하는 모든 것을 이해하는데 어려움을 겪습니다 (v. "옳은 일"을하는 "래퍼 (wrapper)"쉘 스크립트를 제공하는 것). 또한 더 많은 테스트/모듈을 추가 할 때마다이 기능이 빠르게 다루기 힘들어지는 느낌을받습니다. – Marco
물론입니다! 파이썬 경로, sys.path 등을 변경할 수없는 제약이없는 한, 수입을 처리하는 방법이 아닙니다. 결국, 위의 첫 번째 단락에서 언급했듯이, 이것을 처리하는 방법은 FLASK_APP를 설정하는 것입니다 , app & unittest를 패키지로 실행하십시오. – Aaron