2014-11-14 14 views
7

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() 

Trả lời

8

Ở đây, "con đường thử nghiệm" nên được một thư mục có chứa các kiểm tra bạn muốn chạy, không phải đường dẫn đến một mô-đun. Hãy thử chỉ sử dụng . làm thư mục (giả sử bạn đang chạy nó từ thư mục dự án/ứng dụng cấp cao nhất) và xem điều đó có hữu ích không.

Nhóm của tôi giữ kiểm tra của chúng tôi trong một thư mục riêng biệt từ mã nguồn của chúng tôi, vì vậy chúng tôi sẽ sử dụng đường dẫn đến thư mục thử nghiệm của chúng tôi làm đối số thứ hai đó.

+0

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

Các vấn đề liên quan