2010-01-19 20 views
50

मैं अपना पहला एंड्रॉइड डेटाबेस बैकएंड लिख रहा हूं और मैं अपने डेटाबेस के निर्माण की इकाई परीक्षण करने के लिए संघर्ष कर रहा हूं।एंड्रॉइड यूनिट टेस्ट संदर्भ की आवश्यकता

वर्तमान में जिस समस्या का सामना कर रहा हूं वह SQLiteOpenHelper के कार्यान्वयन के लिए एक मान्य संदर्भ वस्तु प्राप्त कर रहा है। क्या टेस्टकेस विस्तारित कक्षा में संदर्भ वस्तु प्राप्त करने का कोई तरीका है? जिस समाधान का मैंने सोचा है, वह है कि मेरे टेस्टकेस की सेटअप विधि में एक गतिविधि को तुरंत चालू करें और उसके बाद उस गतिविधि का संदर्भ फ़ील्ड वेरिएबल को असाइन करें जो मेरी टेस्ट विधियों तक पहुंच सके ... लेकिन ऐसा लगता है कि एक आसान तरीका होना चाहिए।

आपके इनपुट के लिए धन्यवाद!

मैसी

उत्तर

37

आप AndroidTestCase का उपयोग करने जा कोशिश कर सकते हैं। दस्तावेज़ों को देखने से, ऐसा लगता है कि यह आपको SQLiteOpenHelper को पास करने के लिए एक वैध संदर्भ प्रदान करने में सक्षम होना चाहिए।

संपादित करें: ध्यान रखें कि आपको ग्रहण में "एंड्रॉइड टेस्ट प्रोजेक्ट" में अपने परीक्षण सेटअप करना होगा, क्योंकि परीक्षण एमुलेटर (या वास्तविक डिवाइस) पर निष्पादित करने का प्रयास करेंगे।

+0

धन्यवाद एरिक, जो निश्चित रूप से जाने के लिए सही रास्ता है। –

+0

AndroidTestCase को विस्तारित करते समय और फिर 'this.getContext()', 'null' को कॉल किया जाता है। यह है कि यह कैसे काम करना चाहिए? मुझे उम्मीद है कि एक समृद्ध संदर्भ वापस लौटाया जाएगा जो SQLite – cdaringe

+3

एंड्रॉइडटेस्टकेस के साथ काम करेगा, अब इसे हटा दिया गया है, और इसकी बजाय इंस्ट्रुमेंटेशन रजिस्ट्री का उपयोग करने की अनुशंसा की जाती है। –

1

आपको एप्लिकेशनटेस्टकेस या सर्विसटेस्टकेस का उपयोग करना चाहिए।

4

AndroidTestCase:getContext() विधि का उपयोग केवल मेरे अनुभव में एक स्टब संदर्भ देता है। मेरे परीक्षणों के लिए, मैं अपने मुख्य ऐप में एक खाली गतिविधि का उपयोग कर रहा हूं और इसके माध्यम से Context प्राप्त कर रहा हूं। मैं ActivityInstrumentationTestCase2 कक्षा के साथ टेस्ट सूट क्लास का विस्तार भी कर रहा हूं। लगता है मेरे लिए काम करता है।

public class DatabaseTest extends ActivityInstrumentationTestCase2<EmptyActivity> 
    EmptyActivity activity; 
    Context mContext = null; 
    ... 
    @Before 
    public void setUp() { 
     activity = getActivity(); 
     mContext = activity; 
    } 
    ... //tests to follow 
} 

हर कोई क्या करता है?

1

AndroidTestCase को विस्तारित करना और एंड्रॉइड टेस्टकेस को कॉल करना: getContext() ने मेरे लिए संदर्भ प्राप्त करने और SQLiteDatabase के साथ इसका उपयोग करने के लिए ठीक काम किया है।

केवल कालापव्यय कि डेटाबेस यह बनाता है और/या उपयोग करता है उत्पादन एप्लिकेशन द्वारा किया गया एक के रूप में ही होगा ताकि आप शायद दोनों

उदाहरण के लिए एक अलग फ़ाइल नाम का उपयोग करना चाहते जाएगा।

public static final String NOTES_DB  = "notestore.db"; 
    public static final String DEBUG_NOTES_DB = "DEBUG_notestore.db"; 
1

आप MockContext से निकाले जाते हैं और उदाहरण के लिए वापस जाने के एक MockResourcesgetResources() पर, एक वैध ContentResolvergetContentResolver() पर, आदि, की अनुमति देता है कि कुछ दर्द के साथ, कुछ इकाई परीक्षण कर सकते हैं।

विकल्प उदाहरण के लिए Robolectric चलाने के लिए है जो एक संपूर्ण एंड्रॉइड ओएस अनुकरण करता है। वे सिस्टम परीक्षण के लिए होंगे: यह चलाने के लिए बहुत धीमा है।

-1

वैकल्पिक समाधान ApplicationTestCase या AndroidTestCase या Context पर निर्भर किसी भी अन्य वर्ग के उपयोग से बचने के लिए है।

public interface UsersManager{ 
    User createUser(String userId); 
    User getUser(String userId); 
    boolean updateUser(User user); 
    boolean deleteUser(User user); 
} 

और दो संस्करणों को लागू: परीक्षण के लिए एक और उत्पादन क्रम के लिए एक अन्य बिंदु SQLite या ORM ढांचे का परीक्षण करने की आवश्यकता नहीं है कि ताकि आप बुनियादी CRUD तरीकों के साथ इंटरफेस बना सकते है।परीक्षण के लिए संस्करण आसानी से HashMap के साथ लागू किया जा सकता है:

public class TestUsersManager implements UsersManager{ 

    private HashMap<String, User> users = new HashMap(); 

    public User createUser(String userId){ 
    User result = new User(userId); 
    users.put(userId, user); 
    return result; 
    } 
    //... other methods 
} 

यह (SQLite के मामले में कोई डिस्क नहीं IO) तेजी से काम करता है और बाहरी निर्भरता नहीं है। वैसे यह अबास्ट्रक्शन का अतिरिक्त स्तर भी है: उदाहरण के लिए आप आसानी से ORM ढांचे के बीच स्विच कर सकते हैं।

14

आप AndroidJUnit4 के साथ अपने परीक्षण चल रहे हैं यदि आप एक संदर्भ पाने के लिए InstrumentationRegistry तरीकों का उपयोग कर सकते हैं:

InstrumentationRegistry.getTargetContext() - लक्ष्य आवेदन के आवेदन Context प्रदान करता है;

InstrumentationRegistry.getContext() - इस इंस्ट्रुमेंटेशन के पैकेज के Context प्रदान करता है;

+1

एंड्रॉइडJUnit4.class किस निर्भरता से आता है? एक और पूर्ण उदाहरण की आवश्यकता पर – Ewoks

+3

ditto। – StarWind0

0

पहले (एंड्रॉइडटेस्ट) के तहत टेस्ट क्लास बनाएं।

अब कोड निम्न का उपयोग करें:

public class YourDBTest extends InstrumentationTestCase { 

private DBContracts.DatabaseHelper db; 
private RenamingDelegatingContext context; 

@Override 
public void setUp() throws Exception { 
    super.setUp(); 
    context = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test_"); 
    db = new DBContracts.DatabaseHelper(context); 
} 

@Override 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

@Test 
public void test1() throws Exception { 
    // here is your context 
    context = context; 
}} 
संबंधित मुद्दे