2015-05-29 6 views
7

मैं आज एक साधारण परीक्षण है:क्या कई परीक्षण विधियों के साथ एस्प्रेसो परीक्षण चलाने का कोई तरीका है लेकिन केवल एक सेटअप विधि है?

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class WhenNavigatingToUsersView { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = 
     new ActivityTestRule(MainActivity.class); 
    private MainActivity mainActivity; 

    @Before 
    public void setActivity() { 
     mainActivity = mActivityRule.getActivity(); 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
    } 

    @Test 
    public void thenCorrectViewTitleShouldBeShown() { 
     onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); 
    } 

    @Test 
    public void thenCorrectUserShouldBeShown() { 
     onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); 
    } 
} 

लेकिन हर परीक्षा पद्धति setActivity चलाया जाता है, जो, आप 10-15 के तरीकों है, अंत में समय लगता है (यदि आप का एक बहुत कुछ है हो जाएगा के लिए विचार भी)।

@BeforeClass काम नहीं कर रहा है क्योंकि यह स्थैतिक होना चाहिए और इस प्रकार ActivityTestRule को स्थिर भी होना चाहिए।

तो क्या ऐसा करने का कोई और तरीका है? एक ही परीक्षण विधि में एकाधिक आवेषण होने की बजाय?

उत्तर

3

@Before एनोटेशन केवल प्रारंभिक सेटअप वाले तरीकों से पहले होना चाहिए। आवश्यक वस्तुओं की शुरुआत, वर्तमान सत्र या वर्तमान गतिविधि प्राप्त करना, आपको विचार मिलता है।

यह गतिविधि इंस्ट्रूमेंटेशनटेस्टकेस 2 से पुरानी setUp() विधि को प्रतिस्थापित कर रहा है, जैसे @AftertearDown() को प्रतिस्थापित करता है। इसका मतलब है कि यह वर्ग में प्रत्येक परीक्षा से पहले निष्पादित किया जाना है और इसे इस तरह से रहना चाहिए।

के बाद से है कि अपने उद्देश्य नहीं है आप, कोई ViewInteraction, कोई DataInteraction, इस विधि में कोई Assertions है और न ही View कार्रवाई होनी चाहिए।

आपके मामले में, बस setActivity() से onView() कॉल को हटाने और वास्तविक परीक्षण तरीकों के अंदर डाल दिया यदि आवश्यक हो तो हर परीक्षा पद्धति में, है, तो जैसे:

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class WhenNavigatingToUsersView { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = 
     new ActivityTestRule(MainActivity.class); 
    private MainActivity mainActivity; 

    @Before 
    public void setActivity() { 
     mainActivity = mActivityRule.getActivity(); 
     // other required initializations/definitions 
    } 

    @Test 
    public void thenCorrectViewTitleShouldBeShown() { 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
     onView(withText("This is the Users Activity.")).check(matches(isDisplayed())); 
    } 

    @Test 
    public void thenCorrectUserShouldBeShown() { 
     onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
     onView(withText("Donald Duck (1331)")).check(matches(isDisplayed())); 
    } 
} 
+0

आप मेरी बात याद कर रहे हैं ... क्या कोई तरीका है कि प्रत्येक टेस्ट विधि के लिए व्यू इंटरैक्शन को परिभाषित न करें? मेरे लिए एक अच्छा यूनिट परीक्षण यह है कि एक परीक्षण विधि में प्रति परीक्षण केवल एक जोर होना चाहिए और सेटअप किसी अन्य विधि में किया जाना चाहिए। इस विचार पर विचार करें कि वे फ़ील्ड से भरे रहेंगे जो मैं सत्यापित करना चाहता हूं कि वे मौजूद हैं, तो प्रत्येक परीक्षण के लिए दृश्य के साथ बातचीत करना बहुत महंगा होगा। जब मैं केवल एक बार उस दृश्य को "खोलना" चाहता हूं और कई परीक्षण करता हूं। – peuhse

+0

मुझे सेट एक्टिविटी में इंटरैक्शन और अन्य सामान क्यों नहीं दिखना चाहिए? एक बेहतर नाम सेटअप होगा या कुछ और परीक्षण के लिए सभी आवश्यक शर्तें जोड़ें। यह जूनिट में @ सबसे पहले कीवर्ड का इरादा है ... – peuhse

0

आप के लिए एक अन्य विकल्प इन परीक्षणों को अलग किया जाएगा ।

उपयोगकर्ता के आइकन पर क्लिक करना होम एक्टिविटी टेस्ट क्लास में होगा जबकि शेष परीक्षण उपयोगकर्ता एक्टिविटी टेस्ट क्लास में होंगे।

उपयोगकर्ता एक्टिविटी टेस्ट क्लास उचित इरादे से उपयोगकर्ता सक्रियता लॉन्च करेगी (आप नियम कन्स्ट्रक्टर में झूठे बूलियन को पार करके और मैन्युअल रूप से launchActivity(intent) पर कॉल करके ऐसा कर सकते हैं)।

यह हर बार गतिविधि को स्थापित करने की आवश्यकता को खत्म कर देगा। यह मुख्य गतिविधि पर लगातार निर्भरता से छुटकारा पायेगा। यदि कुछ गलत हो जाता है, तो आपका उपयोगकर्ता सक्रियता परीक्षण बरकरार रहेगा और परिणाम देगा, जबकि समस्या मुख्य क्रिया में परीक्षण द्वारा पकड़ा जाएगा।

दरअसल, ऐसा करने से आपका परीक्षण मध्यम आकार बन जाएगा क्योंकि रनटाइम में भारी कमी आएगी। इस आदेश से अपने परीक्षण चलाने के लिए

**** Setting **** 
public void testStory() throws Exception { 

} 

public void testStory2() throws Exception { 

} 

public void testStory3() throws Exception { 

} 

प्रयास करें:

+0

मैं शायद ऐसा कुछ कर सकता था। लेकिन उपयोगकर्ता सक्रियता एक गतिविधि नहीं है, यह एक टुकड़ा है। मेरे पास अभी तक एक गतिविधि है; मुख्य गतिविधि। और सभी नेविगेशन विभिन्न टुकड़ों में चला जाता है। – peuhse

0

आप इस कोशिश कर सकते हैं

./gradlew cC 
0

आप इसे करने का प्रयास इस प्रकार है या इसके बारे में एक मामूली बदलाव आपकी आवश्यकताओं के अनुरूप के रूप में किया:

@Rule 
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class); 
private MainActivity mainActivity = mActivityRule.getActivity(); 

@BeforeClass 
public static void setActivity() { 
    onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click()); 
} 

इस तरह, आप 'मुख्य सक्रियता' स्थिर होने की आवश्यकता नहीं है।इसके अलावा, setActivity() विधि केवल एक बार कॉल की जाएगी।

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