یه بار برای همیشه، فرانت‌اندو اصولی یاد بگیر! یه بار برای همیشه، فرانت‌اندو اصولی یاد بگیر!
🎯 ثبت نام

تست لایه ی UI اپلیکیشن/رابط کاربری با استفاده از فریم ورک تست گیری Robotium

Robotium

Robotium یک افزونه برای فریم ورک تست گیری اندروید است و صرفا برای آسان سازی نوشتن تست های نرم افزاری برای UI اپلیکیشن طراحی شده است. تست های Robotium اعضای کلاس ActivityInstrumentationTestCase2 را به ارث برده و به شما این امکان را می دهد تا test case هایی (مورد آزمایش) بنویسید که چندین activity را شامل می شود.

نکته :

تست هایی که بر اساس Robotium طراحی می شوند منحصرا با لایه UI اپلیکیشن تعامل دارند. به عبارت دیگر این نوع تست ها فرض می گیرند که اپلیکیشن مورد آزمایش یک جعبه ی سیاه است که محتویات و کد داخل آن اطلاعاتی ندارد.

Robotium، همان طور که قبلا ذکر شد، نوعی افزونه برای فریم ورک تست گیری اندروید می باشد (چارچوب طراحی تست نرم افزاری اندروید را بسط می دهد) که نوشتن تست برای اپلیکیشن های اندرویدی را آسان می سازد.

کلاس اصلی فریم ورک مزبور برای طراحی تست، Solo می باشد. این کلاس به مجرد ساخت test case و تست activity مقداردهی اولیه می شود.

نصب Robotium

جهت تست Robotium در پروژه ی اندرویدی خود، لازم است کتابخانه (dependency) مورد نیاز آخرین ویرایش Robotium را به فایل build اضافه نمایید.

1
2
3
4
5
dependencies {
    // Unit testing dependencies
    androidTestCompile 'com.jayway.android.robotium:robotium:5.4.12'
}
<button></button>

در زمان تنظیم مقاله ی حاضر، 5.4.1 جدیدترین ویرایش Rbotium می باشد.

نمونه ای از پیاده سازی تست های Robotium

کد زیر نحوه ی پیاده سازی و استفاده از فریم ورک Robotium در تست یک activity (تست لایه ی رابط کاربری اپلیکیشن) را نمایش می دهد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package de.vogella.android.test.target.test;
import junit.framework.Assert;
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;
import de.vogella.android.test.target.SimpleActivity;
import de.vogella.android.test.target.SimpleListActivity;
public class SimpleActivityTest extends
                ActivityInstrumentationTestCase2<simpleactivity> {
        private Solo solo;
        public SimpleActivityTest() {
                super(SimpleActivity.class);
        }
        public void setUp() throws Exception {
                solo = new Solo(getInstrumentation(), getActivity());
        }
        @Override
        public void tearDown() throws Exception {
                solo.finishOpenedActivities();
        }
}
</simpleactivity><button></button>

در زیر نمونه ی دیگری از کاربرد متد تست گیری Robotium را مشاهده می کنید که در آن پیاده سازی یک لیست مورد آزمایش قرار می گیرد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// check that we have the right activity
solo.assertCurrentActivity("wrong activity", SimpleActivity.class);
// Click a button which will start a new Activity
// Here we use the ID of the string to find the right button
solo.clickOnButton(solo.getString(R.string.button1));
// Validate that the Activity is the correct one
solo.assertCurrentActivity("wrong activity", SimpleListActivity.class);
solo.clickInList(1);
// searchForText has a timeout of 5 seconds
assertTrue(solo.waitForText("Android")); // Assertion
solo.clickInList(2);
assertTrue(solo.waitForText("iPhone")); // Assertion
solo.clickInList(3);
assertTrue(solo.waitForText("Blackberry")); // Assertion
solo.goBack();
solo.clickOnButton("Button2");
solo.clickOnButton("Button3");
// open the menu
solo.sendKey(Solo.MENU);
solo.clickOnText("Preferences");
solo.clickOnText("User");
solo.clearEditText(0);
Assert.assertTrue(solo.searchText(""));
solo.enterText(0, "http//:www.vogella.com");
Assert.assertTrue(solo.searchText("http//:www.vogella.com"));
solo.goBack();
<button></button>

توابع کتابخانه ای Robotium API /

Solo توابعی برای فراخوانی کامپوننت های رابط کاربری ( کامپوننت های UI اپلیکیشن اندرویدی) در اختیار توسعه قرار می دهد. در جدول زیر تعدادی از این توابع را همراه با شرح کاربرد مشاهده می نمایید.

متد
شرح
getView(int id)
بر اساس (پارامتر) ID ارائه شده، view مد نظر را در activity جاری پیدا کرده و به عنوان خروجی برمی گرداند.
assertCurrentActivity(text, Activity.class)
انتظار دارد که activity جاری با دومین پارامتر ارسالی به تابع، برابر باشد.
getCurrentActivity() .getFragmentManager() .findFragmentById()
Fragment مورد نظر را پیدا کرده و در خروجی برمی گرداند.
waitForText(text)
به مدت 5 ثانیه برای مقدار متنی مورد نظر (ارائه شده به عنوان پارامتر) در UI اپلیکیشن جاری جستجو می کند (منتظر وارد شدن متن در صفحه می شود).
clickOnButton(text)
بر روی کنترل دکمه ی ای که مقدار متنی "text" را دارد کلیک می کند.
sendKey(Solo.MENU);
Sends the menu key event.Event کلید منو را ارسال می کند.
clickOnText(text)
در رابط کاربری اپلیکیشن جاری، مقدار متنی که به عنوان پارامتر به تابع ارسال شده را در خروجی برمی گرداند.
enterText()
یک متن ساده در رابط کاربری جاری وارد می کند.
searchText(text)
در رابط کاربری جاری، متنی که به عنوان پارامتر به تابع حاضر ارسال شده را جستجو کرده و در صورت یافتن، مقدار بولی true را بازمی گرداند.
searchButton(text)
کنترل دکمه ای که مقدار متنی (text) آن با مقدار پارامتر ارسالی منطبق می باشد را در رابط کاربری جاری پیدا می کند.
clickOnSearch()
امکان کلیک بر روی بخشی از نمایشگر را به شما می دهد.
goBack()
دکمه ی بازگشت را فشار می دهد.
setDatePicker()
یک تاریخ در کنترل DatePicker اندروید انتخاب می کند.
clickInList(x);
بر روی آیتم در لیست ساده/ListView کلیک می کند.
pressSpinnerItem(0,2);
یک آیتم در لیست کشویی/Spinner را فشار می دهد.
isCheckBoxChecked()
بررسی می کند آیا چک باکس تیک دار و فعال شده است یا خیر.
takeScreenshot()
یک عکس (screenshot) از وضعیت جاری تهیه کرده و داخل حافظه ی دستگاه میزبان در آدرس /sdcard/Robotium-Screenshots/ ذخیره می کند. لازم است جهت فراخوانی این تابع، مجوز theandroid.permission.WRITE_EXTERNAL_STORAGE را در فایل تنظیمات AndroidManifest.xml مربوط به اپلیکیشن مورد تست اعلان نمایید.
waitForActivity(SecondActivity.class, 2000)
به مدت 2 ثانیه منتظر activity ارسال شده به تابع به عنوان پارامتر می ماند (چنانچه در مدت معین شده activity یافت نشد، مقدار بولی false را بازمی گرداند).

می توانید با فراخوانی متد solo.setActivityOrientation(Solo.LANDSCAPE) وضعیت نمایش (orientation) صفحه ی جاری (activity) را تنظیم نمایید.

جهت تست رشته های ترجمه شده و بین المللی (internationalized strings)، می بایست با فراخوانی متد getString(id) به فایل resources از پروژه مورد تست دسترسی پیدا کنید. مثال:

1
2
3
// Here we use the ID of the string to find the right button
solo.clickOnButton(solo.getString(de.vogella.android.test.target.R.string.button1));
<button></button>

اجرای تست

تست Robotium را به همان شیوه ای که محیط کاری Eclipse را راه اندازی می کنید، با کلیک راست بر روی test class (کلاس آزمایشی) و انتخاب آیتم Run-As ▸ Android JUnit Test از منو، اجرا نمایید.

در صورت تمایل می توانید تست های Robotium را با درج دستور زیر در پنجره ی فرمان، اجرا نمایید.

1
2
3
adb shell am instrument
  -w de.vogella.android.test.tester/android.test.InstrumentationTestRunner
<button></button>
تمرین: تست نویسی با توابع Robotium

تمرین: نوشتن یک تست واقعی با Robotium

یک پروژه ی جدید اندروید به نام com.vogella.android.test.robotium.target ایجاد نمایید. در صفحه یا activity اول سه کنترل دکمه قرار دهید. پس از کلیک بر روی دکمه، با توجه به کدی که نوشته اید، می بایست activity (صفحه) دیگری فراخوانی شده و یک لیست را برای کاربر به نمایش بگذارد.

ساخت پروژه ی آزمایشی و اضافه کردن کتابخانه ی Robotium به آن

یک پروژه ی جدید جهت تست به نام com.vogella.android.test.robotium.targetTest ایجاد نمایید. سپس داخل آن پوشه ی جدیدی به نام libs ایجاد کرده و فایل Robotium JAR را در آن جایگذاری نمایید.

نکته :

پس از جایگذاری فایل JAR در پوشه ی نام برده، مجموعه ابزار Android (android tooling) محیط کاری Eclipse خود به صورت اتوماتیک آن را به build path پروژه ی شما اضافه می کنید. لازم به ذکر است که قرار دادن فایل JAR در پوشه ای با اسم متفاوت، غالبا سبب رخداد خطای ClassNotFoundExeception برای کلاس Solo می شود.

ایجاد پروژه ی آزمایشی و افزودن کتابخانه ی Robotium

کلاس آزمایشی (test class) زیر را پیاده سازی نمایید.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package de.vogella.android.test.target.test;
import junit.framework.Assert;
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;
import de.vogella.android.test.target.SimpleActivity;
import de.vogella.android.test.target.SimpleListActivity;
public class SimpleActivityTest extends
                ActivityInstrumentationTestCase2<simpleactivity> {
        private Solo solo;
        public SimpleActivityTest() {
                super(SimpleActivity.class);
        }
        public void setUp() throws Exception {
                solo = new Solo(getInstrumentation(), getActivity());
        }
        @Override
        public void tearDown() throws Exception {
                solo.finishOpenedActivities();
        }
        public void testListItemClickShouldDisplayToast() throws Exception {
                // check that we have the right activity
                solo.assertCurrentActivity("wrong activity", SimpleActivity.class);
                // Click a button which will start a new Activity
                // Here we use the ID of the string to find the right button
                solo.clickOnButton(solo
                                .getString(de.vogella.android.test.target.R.string.button1));
                // assert that the current activity is the SimpleListActivity.class
                solo.assertCurrentActivity("wrong activity", SimpleListActivity.class);
                solo.clickInList(1);
                // searchForText has a timeout of 5 seconds
                assertTrue(solo.waitForText("Android")); // Assertion
                solo.clickInList(2);
                assertTrue(solo.waitForText("iPhone")); // Assertion
                solo.clickInList(3);
                assertTrue(solo.waitForText("Blackberry")); // Assertion
                solo.goBack();
                solo.clickOnButton("Button2");
                solo.clickOnButton("Button3");
        }
        public void testListItemClickShouldDisplayToast() throws Exception {
                // open the menu
                solo.sendKey(Solo.MENU);
                solo.clickOnText("Preferences");
                solo.clickOnText("User");
                solo.clearEditText(0);
                Assert.assertTrue(solo.searchText(""));
                solo.enterText(0, "http//:www.vogella.com");
   Assert.assertTrue(solo.searchText("http//:www.vogella.com"));
                solo.goBack();
        }
}
</simpleactivity><button></button>

برطرف کردن خطاهای اپلیکیشن

فرض کنید تست با تنظمیات و پیاده سازی شما از عملکرد صحیح برخوردار می باشد ولی اپلیکیشن نتیجه ی مورد انتظار را ارائه نمی دهد. اپلیکیشن را طوری ویرایش کنید که تست با موفقیت انجام شود.

1396/01/17 3370 1768
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...