Tôi đang cố gắng tìm hiểu thử nghiệm đơn vị với Google App Engine bằng cách sử dụng mã chính xác mà họ đặt trên trang Thử nghiệm Đơn vị Cục bộ cho Python (https://cloud.google.com/appengine/docs/python/tools/localunittesting). Tôi không thể tìm ra lỗi này, mặc dù:Kiểm tra Đơn vị Ứng dụng của Động cơ: NhậpError: Thư mục bắt đầu không thể nhập
ImportError: Start directory is not importable: 'testmem.py'
Tôi chỉ sử dụng khuôn khổ kiểm tra đơn giản của họ như testrunner.py và Datastore của họ và kiểm tra Memcache trong một tập tin gọi là testmem.py. Tôi gọi thử nghiệm từ thư mục gốc của dự án là:
<me>$ python testrunner.py ~/google_appengine testmem.py
điều này phù hợp với mức sử dụng như tôi có thể nói:% prog SDK_PATH TEST_PATH.
cấu trúc tập tin của tôi là:
__init__.py
app.yaml
testrunner.py
testmem.py
helloworld.py
bất cứ ai có thể cho tôi biết những gì tôi đang làm sai ở đây? Cảm ơn trước.
Toàn bộ thông báo lỗi:
Traceback (most recent call last):
File "testrunner.py", line 30, in <module>
main(SDK_PATH, TEST_PATH)
File "testrunner.py", line 17, in main
suite = unittest.loader.TestLoader().discover(test_path)
File "/usr/lib/python2.7/unittest/loader.py", line 204, in discover
raise ImportError('Start directory is not importable: %r' % start_dir)
ImportError: Start directory is not importable: 'testmem.py'
testrunner.py:
#!/usr/bin/python
import optparse
import sys
import unittest
USAGE = """%prog SDK_PATH TEST_PATH
Run unit tests for App Engine apps.
SDK_PATH Path to the SDK installation
TEST_PATH Path to package containing test modules"""
def main(sdk_path, test_path):
sys.path.insert(0, sdk_path)
import dev_appserver
dev_appserver.fix_sys_path()
suite = unittest.loader.TestLoader().discover(test_path)
unittest.TextTestRunner(verbosity=2).run(suite)
if __name__ == '__main__':
parser = optparse.OptionParser(USAGE)
options, args = parser.parse_args()
if len(args) != 2:
print 'Error: Exactly 2 arguments required.'
parser.print_help()
sys.exit(1)
SDK_PATH = args[0]
TEST_PATH = args[1]
main(SDK_PATH, TEST_PATH)
testmem.py:
import unittest
from google.appengine.api import memcache
from google.appengine.ext import db
from google.appengine.ext import testbed
class TestModel(db.Model):
"""A model class used for testing."""
number = db.IntegerProperty(default=42)
text = db.StringProperty()
class TestEntityGroupRoot(db.Model):
"""Entity group root"""
pass
def GetEntityViaMemcache(entity_key):
"""Get entity from memcache if available, from datastore if not."""
entity = memcache.get(entity_key) # @UndefinedVariable
if entity is not None:
return entity
entity = TestModel.get(entity_key)
if entity is not None:
memcache.set(entity_key, entity) # @UndefinedVariable
return entity
class DemoTestCase(unittest.TestCase):
def setUp(self):
# First, create an instance of the Testbed class.
self.testbed = testbed.Testbed()
# Then activate the testbed, which prepares the service stubs for use.
self.testbed.activate()
# Next, declare which service stubs you want to use.
self.testbed.init_datastore_v3_stub()
self.testbed.init_memcache_stub()
def tearDown(self):
self.testbed.deactivate()
def testInsertEntity(self):
TestModel().put()
self.assertEqual(1, len(TestModel.all().fetch(2)))
def testFilterByNumber(self):
root = TestEntityGroupRoot(key_name="root")
TestModel(parent=root.key()).put()
TestModel(number=17, parent=root.key()).put()
query = TestModel.all().ancestor(root.key()).filter('number =', 42)
results = query.fetch(2)
self.assertEqual(1, len(results))
self.assertEqual(42, results[0].number)
def testGetEntityViaMemcache(self):
entity_key = str(TestModel(number=18).put())
retrieved_entity = GetEntityViaMemcache(entity_key)
self.assertNotEqual(None, retrieved_entity)
self.assertEqual(18, retrieved_entity.number)
if __name__ == '__main__':
unittest.main()
Cảm ơn rất nhiều: đó là nó. Nó không trực quan với tôi rằng người thử nghiệm sẽ đi qua toàn bộ thư mục tìm tất cả các mô-đun với các bài kiểm tra trong đó; Tôi cho rằng tôi phải cụ thể. Nó làm cho tinh thần tại sao tất cả các bài kiểm tra nên được trong thư mục riêng của họ sau đó. – Mike