2014-11-14 8 views
7

मैं पाइथन पृष्ठ (https://cloud.google.com/appengine/docs/python/tools/localunittesting) के लिए स्थानीय यूनिट परीक्षण पर डाले गए सटीक कोड का उपयोग करके Google App Engine के साथ यूनिट परीक्षण सीखने की कोशिश कर रहा हूं। मैं यह त्रुटि पता लगा सकते हैं नहीं है, हालांकि:ऐप इंजन यूनिट परीक्षण: आयात त्रुटि: प्रारंभ निर्देशिका आयात करने योग्य नहीं है

ImportError: Start directory is not importable: 'testmem.py' 

मैं सिर्फ testrunner.py और उनके डेटास्टोर और एक फ़ाइल बुलाया testmem.py में Memcache परीक्षण के रूप में उनके सरल परीक्षण ढांचे का उपयोग कर रहा हूँ।

<me>$ python testrunner.py ~/google_appengine testmem.py 

इस जहाँ तक मैं बता सकता हूँ उपयोग मेल खाता है::% prog SDK_PATH TEST_PATH मैं के रूप में परियोजना रूट निर्देशिका से परीक्षण कहते हैं।

मेरे फ़ाइल संरचना है:

__init__.py 
app.yaml 
testrunner.py 
testmem.py 
helloworld.py 

किसी को भी मुझे बता सकते हैं मैं गलत यहाँ क्या कर रहा हूँ? अग्रिम में धन्यवाद।

पूरा त्रुटि संदेश:

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

उत्तर

8

यहाँ, "परीक्षण पथ" एक निर्देशिका है कि शामिल होना चाहिए परीक्षण जो आप चलाना चाहते हैं, एक मॉड्यूल के पथ नहीं। निर्देशिका के रूप में . का उपयोग करके देखें (मान लें कि आप इसे शीर्ष-स्तरीय प्रोजेक्ट/ऐप निर्देशिका से चला रहे हैं) और देखें कि क्या इससे मदद मिलती है।

मेरी टीम हमारे स्रोत कोड से एक अलग निर्देशिका में हमारे परीक्षण रखती है, इसलिए हम उस दूसरी तर्क के रूप में हमारी परीक्षण निर्देशिका के लिए पथ का उपयोग करेंगे।

+0

बहुत बहुत धन्यवाद: वह था। यह मेरे लिए सहज नहीं था कि testrunner उन सभी परीक्षणों के साथ सभी मॉड्यूल खोजने के लिए एक पूरी निर्देशिका के माध्यम से जाना होगा; मुझे लगता है कि मुझे विशिष्ट होना था। यह समझ में आता है कि सभी परीक्षण तब अपनी निर्देशिका में क्यों होना चाहिए। – Mike

संबंधित मुद्दे