आप कई गतिविधियों में Android एप्लिकेशन का परीक्षण कैसे करते हैं?


80

हम कई गतिविधियों में फैले कई स्क्रीन और वर्कफ़्लोज़ से मिलकर एक जटिल एंड्रॉइड एप्लिकेशन बना रहे हैं। हमारे वर्कफ़्लोज़ बैंक के एटीएम मशीन पर आपके द्वारा देखे जा सकने वाले समान हैं, उदाहरण के लिए, Activityमुख्य मेनू में उस बदलाव को लॉगिन करना है Activityजो उपयोगकर्ता की पसंद के आधार पर अन्य गतिविधियों में संक्रमण कर सकता है।

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

हमने परीक्षण API के साथ खिलवाड़ किया है जो Android के साथ आता है (उदाहरण के लिए ActivityInstrumentationTestCase2) और Positron के साथ भी , लेकिन न तो एकल की सीमा से परे परीक्षण करने में सक्षम हैं Activity, और जब हम कुछ यूनिट परीक्षण के लिए इन उपकरणों में कुछ उपयोगिता पा सकते हैं, तो वे जीत गए परीक्षण गतिविधियों के लिए हमारी आवश्यकताओं को पूरा करते हैं जो कई गतिविधियों में कटौती करते हैं।

हम एक xUnit ढांचे, पटकथा, जीयूआई रिकॉर्डर / प्लेबैक आदि के लिए खुले हैं और किसी भी सलाह की सराहना करेंगे।


2
एंड्रॉइड 4.1 के रूप में, अब एंड्रॉइड से एक नया परीक्षण ढांचा है जो गतिविधियों के परीक्षण और वास्तव में पूरे सिस्टम को सक्षम करने में सक्षम बनाता है: डेवलपर.
android.com/tools/testing/testing_ui.html

1
रोबोटियम इस आवश्यकता के अनुरूप होगा और केवल कुछ पंक्तियों में।
डोरी

जवाबों:


65

मुझे अपने खुद के बेशुमार सवालों के जवाब देने में थोड़ा अजीब लगता है, लेकिन यहाँ यह है ...

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

package com.mycompany;

import android.app.*;
import android.content.*;
import android.test.*;
import android.test.suitebuilder.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;

import static org.hamcrest.core.Is.*;
import static org.hamcrest.core.IsNull.*;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.*;
import static com.mycompany.R.id.*;

public class LoginTests extends InstrumentationTestCase {

   @MediumTest
   public void testAValidUserCanLogIn() {

      Instrumentation instrumentation = getInstrumentation();

      // Register we are interested in the authentication activiry...
      Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(AuthenticateActivity.class.getName(), null, false);

      // Start the authentication activity as the first activity...
      Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      intent.setClassName(instrumentation.getTargetContext(), AuthenticateActivity.class.getName());
      instrumentation.startActivitySync(intent);

      // Wait for it to start...
      Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Type into the username field...
      View currentView = currentActivity.findViewById(username_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyUsername");

      // Type into the password field...
      currentView = currentActivity.findViewById(password_field);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(EditText.class));
      TouchUtils.clickView(this, currentView);
      instrumentation.sendStringSync("MyPassword");

      // Register we are interested in the welcome activity...
      // this has to be done before we do something that will send us to that
      // activity...
      instrumentation.removeMonitor(monitor);
      monitor = instrumentation.addMonitor(WelcomeActivity.class.getName(), null, false);

      // Click the login button...
      currentView = currentActivity.findViewById(login_button;
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(Button.class));
      TouchUtils.clickView(this, currentView);

      // Wait for the welcome page to start...
      currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor, 5);
      assertThat(currentActivity, is(notNullValue()));

      // Make sure we are logged in...
      currentView = currentActivity.findViewById(welcome_message);
      assertThat(currentView, is(notNullValue()));
      assertThat(currentView, instanceOf(TextView.class));
      assertThat(((TextView)currentView).getText().toString(), is("Welcome, MyUsername!"));
   }
}

यह कोड स्पष्ट रूप से बहुत पठनीय नहीं है। मैंने वास्तव में इसे एक अंग्रेजी जैसे एपीआई के साथ एक साधारण पुस्तकालय में निकाला है, इसलिए मैं सिर्फ इस तरह की बातें कह सकता हूं:

type("myUsername").intoThe(username_field);
click(login_button);

मैंने लगभग 4 गतिविधियों की गहराई से जांच की है और मैं संतुष्ट हूं कि दृष्टिकोण काम करता है, जैसा कि मैंने कहा, एक सामयिक समय मुद्दा प्रतीत होता है जिसे मैंने पूरी तरह से समझ नहीं पाया है। मैं अभी भी गतिविधियों में परीक्षण के किसी भी अन्य तरीकों की सुनवाई में दिलचस्पी रखता हूं।


3
आप FlakyTest एनोटेशन को जोड़ने का प्रयास कर सकते हैं जब समय समस्याएँ विफल होने के कारण परीक्षण को स्वचालित रूप से दोहराते हैं। समाधान नहीं, वास्तव में, लेकिन कुछ स्थितियों में व्यवहार्य समाधान।
कार्ल मैन्स्टर

इसे लिखने के लिए धन्यवाद! मैं अपने परीक्षण के लिए ActivMonitors की कार्यक्षमता के साथ कुछ ढूंढ रहा था। मैं उन्हें ढूंढ नहीं पाया।
पीटर अज़ताई

जहाँ तक मुझे पता है, ऊपर आपने जो कुछ भी किया है ActivityInstrumentationTestCase2
उसका

किसी भी विचार, किस शर्त पर, 'getInstrumentation ()। WaitForIdleSync ();) अनंत पाश में मिल जाएगा? एंड्रॉइड 4.4.2_r2 रनिंग प्रोसेसर बोर्ड में, मैं सीटीएस टेस्ट को निष्पादित करते हुए, इस मुद्दे का सामना कर रहा हूं।
अरुणजेट

मुझे लगता है कि मेरे बेटे @ pajato1 ने आपकी टाइमिंग समस्या को ढूंढा और ठीक किया। उनकी इस समस्या से मेरी समस्या हल हो गई। यहाँ उन्होंने कहा है: "मैंने अभी-अभी javadoc में देखा कि इंस्ट्रूमेंटेशन .startActivitySync () तब तक अवरुद्ध था जब तक कि नई गतिविधि तैयार न हो जाए और फिर उसे वापस कर दिया जाए, इसलिए ऐसा लगता है जैसे मॉनिटर आवश्यक नहीं था। इसे हटाना यह सही साबित हुआ। सिद्धांत यह है कि मॉनिटर एक दौड़ की स्थिति के कारण कुछ मामलों में startActivitySync () द्वारा बनाई गई गतिविधि का कारण बन रहा था। मैंने एंड्रॉइड स्रोत कोड को पढ़ने में कुछ समय बिताया, लेकिन दौड़ की स्थिति के कारण के रूप में मेरे बारे में कुछ भी नहीं निकला। "
पजातो ०

22

एंड्रायड इंस्ट्रूमेंटेशन आउट-ऑफ-द-बॉक्स के साथ जो संभव है उससे कहीं ज्यादा तेजी से और आसानी से एंड्रॉइड एप्लिकेशन के स्वचालित ब्लैक-बॉक्स परीक्षण करने के लिए बनाए गए एक ओपन-सोर्स टेस्ट फ्रेमवर्क रोबोटियम पर एक नज़र डालें

मुखपृष्ठ: http://www.robotium.org/
स्रोत: http://github.com/jayway/robotium

कृपया ध्यान दें कि मैं जिस कंपनी के लिए काम करता हूं, उसके द्वारा रोबोटियम परियोजना का रखरखाव किया जाता है


नमस्ते, इस के लिए एक रिकॉर्डर उपकरण है? मैंने कई वेबसाइटों की जाँच की और टेस्टड्रोइड पाया जो स्क्रिप्ट को रिकॉर्ड करता है और इसे चलाता है। दुर्भाग्य से यह एक फ्रीवेयर नहीं है, क्या आप किसी ऐसे फ्रीवेयर को जानते हैं जो रिकॉर्डिंग प्रक्रिया करते हैं?
thndrkiss

@thndrkiss: मैं इस तरह के किसी भी उपकरण के बारे में पता नहीं है। यदि आप रोबोटियम फोरम पर कोई प्रश्न रखते हैं तो आपको बेहतर उत्तर मिलने की संभावना है।
जोनास सॉडरस्ट्रॉम

2
रोबोटियम एक जीवन रक्षक है। यह आपके परीक्षण को लिखने के लिए बेहद आसान बना देगा (आप मूल रूप से सादे अंग्रेजी में बात कर रहे हैं: इस पर क्लिक करें, वापस बटन दबाएं, आदि) आप कुछ भी परीक्षण कर सकते हैं लेकिन आपको छोटे विवरणों को जानने की आवश्यकता नहीं है। इसके कम से कम दो प्रमुख लाभ हैं: आप उन ऐप्स का परीक्षण कर सकते हैं जिनके पास स्रोत कोड नहीं है, और यह UI पर निर्भर करता है जो इसे बहुत मजबूत बनाते हैं (आप अपने नियंत्रकों / मॉडल को अपने विचारों से बहुत अधिक बदलते हैं ...)
टिटक

8

आप हमेशा रोबोटियम का उपयोग कर सकते हैं। यह सेलेनियम की तरह ब्लैकबॉक्स परीक्षण का समर्थन करता है लेकिन एंड्रॉइड के लिए। यह आपको Robotium.org पर मिलेगा


1
पिछली बार जब मैंने जाँच की तो रोबोटियम का इस्तेमाल गतिविधियों में नहीं किया जा सका। क्या अब इसे ठीक कर दिया गया है? stackoverflow.com/questions/3840034/…
user77115

3
जब तक वे एक ही प्रक्रिया से संबंधित हैं तब तक यह हमेशा गतिविधियों में काम करता है।
Renas

4

मुझे आश्चर्य है कि किसी ने कुछ प्रमुख स्वचालित कार्यात्मक परीक्षण उपकरणों का उल्लेख नहीं किया है । रोबोटियम की तुलना में, इन्हें जावा कोड लिखने की आवश्यकता नहीं है।

MonkeyTalk : कंपनी द्वारा समर्थित एक खुला स्रोत उपकरण गोरिल्ला लॉजिक। पेशेवरों: रिकॉर्डिंग प्रदान करता है और साथ ही गैर-तकनीकी उपयोगकर्ताओं के लिए उच्च-स्तरीय स्क्रिप्टिंग भाषा आसान है, और क्रॉस-प्लेटफ़ॉर्म (आईओएस भी शामिल है)। आवश्यकताओं के रूप में उन लाभों को देखते हुए, हमने इसे सबसे अच्छा समाधान पाया है। यहजावास्क्रिप्ट के उपयोग से उनकी स्क्रिप्टिंग भाषा में क्या किया जा सकता है,इसके अलावा अनुकूलन की अनुमति देताहै।

कैलाश-एंड्रॉइड : ककड़ी-शैली की सुविधाओं के लिए एक ओपन-सोर्स टूल। पेशेवरों: गेरकिन भाषा में विशेषताएँ लिखें जो व्यवसाय पठनीय है, डोमेन विशिष्ट भाषा जो आपको उस व्यवहार को लागू किए बिना सॉफ्टवेयर के व्यवहार का वर्णन करने की सुविधा देती है। ककड़ी- आईओएस में iOS के लिए समान लेकिन सटीक समर्थन उपलब्ध नहीं है । रिकॉर्डिंग क्षमता उतनी अच्छी नहीं है, क्योंकि वे एक बाइनरी आउटपुट का उत्पादन करते हैं।

कुछ अन्य संदर्भ:


3

मैंने Android के लिए एक रिकॉर्ड-और-प्लेबैक टूल बनाया और इसे GitHub पर उपलब्ध कराया । यह कॉन्फ़िगर करना और उपयोग करना आसान है, कोई प्रोग्रामिंग की आवश्यकता नहीं है, वास्तविक उपकरणों के खिलाफ चलता है (जो कि जड़ नहीं होना चाहिए) और स्वचालित रूप से स्क्रीनशॉट को बचाता है क्योंकि यह परीक्षण खेलता है।


यह आशाजनक लग रहा है। उन लोगों के लिए जो इस बिंदु को नहीं देखते हैं: यह इशारों (टैपिंग, ड्रैगिंग और अन्य चीजों) का परीक्षण करने के लिए एक बहुत अच्छा समाधान प्रतीत होता है
टिकिट

3

सबसे पहले, अपने बेस क्लास के रूप में 'एक्टिविटीइंस्टीट्यूशनटेस्टकेज़ 2' का प्रयोग करें, न कि 'इंस्ट्रुमेंटेशनटेस्टकेज़' का। मैं कई गतिविधियों में रोबोटियम और नियमित परीक्षण का उपयोग करता हूं। मैंने पाया कि मुझे लॉगिन गतिविधि को सामान्य प्रकार (और निर्माणकर्ता को वर्ग तर्क) के रूप में निर्दिष्ट करना होगा।

'एक्टिविटीइंस्टीट्यूशनटैस्टकैसे 2' कंस्ट्रक्टर पैकेज तर्क की अनदेखी करता है और इसकी आवश्यकता नहीं होती है। पैकेज लेने वाला कंस्ट्रक्टर पदावनत हो जाता है।

Javadocs से: "ActivityInstrumentationTestCase2 (स्ट्रिंग pkg, क्लास एक्टिविटी क्लॉस)

अनुशंसित बेस क्लास का उपयोग करके फ्रेमवर्क को कुछ बॉयलरप्लेट को संभालने की अनुमति मिलती है, जैसे आपकी गतिविधि शुरू करना। यदि आवश्यक हो तो 'getActivity ()' के लिए कॉल किया जाता है।


3

कुछ संशोधनों के साथ यह उपयोगी पाया गया। सबसे पहले getInstrumentation().waitForIdleSync()सिंगल फ्लैश के स्पेकनेस को ठीक करेगा और InstrumentationTestCaseएक lauchActivityफंक्शन भी होगा जो स्टार्ट एक्टिविटी लाइन्स को बदल सकता है।


2

आप इसे इस तरह से कर सकते हैं ताकि सिंक से बाहर आने वाले प्रतीक्षा समय से बचा जा सके:

final Button btnLogin = (Button) getActivity().findViewById(R.id.button);
Instrumentation instrumentation = getInstrumentation();

// Register we are interested in the authentication activity...
Instrumentation.ActivityMonitor aMonitor = 
        instrumentation.addMonitor(mynextActivity.class.getName(), null, false);

getInstrumentation().runOnMainSync(new Runnable() {
         public void run() {
             btnLogin.performClick();
         }
     });

getInstrumentation().waitForIdleSync();

//check if we got at least one hit on the new activity
assertTrue(getInstrumentation().checkMonitorHit(aMonitor, 1)); 

1

मैं एक ही चीज़ पर बहुत अधिक काम कर रहा हूं, और मैं शायद इस प्रश्न के स्वीकृत उत्तर पर भिन्नता के साथ जाऊंगा, लेकिन मैं एक समाधान के लिए अपनी खोजों के दौरान कैल्कुऑन ( गिटहब ) भर में आया था ।


0

मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है, लेकिन ApplicationTestCase ऐसा लगता है कि जैसा आप देख रहे हैं वैसा हो सकता है।


दुर्भाग्य से ऐसे कोई उदाहरण नहीं हैं जो यह संकेत देते हों कि मामला होना चाहिए।
सिंगलशॉट

हाँ, लगता है कि तुम सही हो ... नाम से छल किया गया था। मैं यह पता नहीं लगा सकता। सबसे अच्छा तरीका जो मुझे अब तक मिला है वह यह है कि अगली गतिविधि शुरू होने की पुष्टि करने के लिए पॉज़िट्रॉन की एक्टिविटी यूनाइटटेस्टकेस का उपयोग करें, लेकिन यह सुसंगत कहानियों के निर्माण में आपकी मदद नहीं करता है। वैकल्पिक रूप से, इंस्ट्रूमेंटेशन TestCase.launchActivity आपको गतिविधियों की एक मनमानी शुरू करने की अनुमति दे सकती है, लेकिन मैं अभी भी इंस्ट्रूमेंटेशन सामान का पता लगाने की कोशिश कर रहा हूं।
एरिक

0

क्या स्वीकार किए जाते हैं दृष्टिकोण अलग-अलग अनुप्रयोगों से विभिन्न गतिविधियों के साथ काम करेगा, विभिन्न प्रमाणपत्रों द्वारा हस्ताक्षरित होगा? यदि नहीं, तो रोबोटियम एक ही एप्लिकेशन के भीतर गतिविधियों का परीक्षण करने का सबसे अच्छा तरीका है।


0

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

button.requestFocus();
sendKeys(KeyEvent.KEYCODE_ENTER);

केवल एक चीज समझ रही है कि हर एपीआई कॉल हमारी मदद करेगी।


0

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

/**
 * Creates a test Activity for a given fully qualified test class name.
 *
 * @param fullyQualifiedClassName The fully qualified name of test activity class.
 *
 * @return The test activity object or null if it could not be located.
 */
protected AbstractTestActivity getTestActivity(final String fullyQualifiedClassName) {
    AbstractTestActivity result = null;

    // Register our interest in the given activity and start it.
    Log.d(TAG, String.format("Running test (%s) with main class: %s.", getName(), fullyQualifiedClassName));
    instrumentation = getInstrumentation();

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setClassName(instrumentation.getTargetContext(), fullyQualifiedClassName);
    // Wait for the activity to finish starting
    Activity activity = instrumentation.startActivitySync(intent);

    // Perform basic sanity checks.
    assertTrue("The activity is null!  Aborting.", activity != null);
    String format = "The test activity is of the wrong type (%s).";
    assertTrue(String.format(format, activity.getClass().getName()), activity.getClass().getName().equals(fullyQualifiedClassName));
    result = (AbstractTestActivity) activity;

    return result;
}

0

बंदर उपकरण परीक्षण का प्रयास करें

चरण 1:

Android स्टूडियो टर्मिनल खोलें (Tools-> खुला टर्मिनल)

चरण 2:

बंदर का उपयोग करने के लिए, एक कमांड प्रॉम्प्ट खोलें और निम्नलिखित निर्देशिका में सिर्फ नाविक करें।

 export PATH=$PATH:/home/adt-bundle-linux-x86-20140702/sdk/platform-tools

चरण 3:

इस बंदर कमांड को टर्मिनल में जोड़ें और एंटर दबाएँ।

अपने एमुलेटर में जादू देखें।

adb shell monkey -p com.example.yourpackage -v 500

500- यह आवृत्ति गणना या परीक्षण के लिए भेजे जाने वाली घटनाओं की संख्या है।

आप इस गिनती को बदल सकते हैं ।।

अधिक संदर्भ,

http://www.tutorialspoint.com/android/android_testing.htm

http://androidtesting.blogspot.in/2012/04/android-testing-with-monkey-tool.html


डाउनवोटर्स को डाउनवोटिंग का कारण बताना होगा ... यह वर्किंग कोड है .. और आधिकारिक परीक्षण विधि भी। यदि कोई गलती हो तो मैं अपना उत्तर सही करने के लिए तैयार हूं ..
रंजीथ कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.