در بازارهای اپ میلیونها برنامه وجود دارد! هر روز به این تعداد اضافه میشود و کاربران آنها را «تست» میکنند. تا الان میلیاردها برنامه در گوشیها و تبلتهای کاربران نصب شده است و هر روز هم بیشتر میشود. برای این که کاربر را مجاب کنیم برنامهای را نصب کند، راه بسیار زیادی را باید طی کنیم: ایده مناسبی داشته باشیم، آن ایده را به خوبی پیادهسازی کنیم، برنامههای پر هزینه تبلیغات را انجام دهیم و … بالاخره کاربر مجاب میشود که برنامه را نصب کند!
برای به دست آوردن یک کاربر باید خیلی تلاش کنید ولی از دست دادن کاربر بسیار ساده اتفاق میافتد.
کافی است کاربر در حین اجرای برنامه به مشکلی بربخورد و بعد از چند ثانیه تصمیم بگیرد که برنامه را حذف کند. به همین سادگی همه تلاشهای چند ماهه یا حتا چند ساله ممکن است از بین برود. راه چاره چیست؟ باید زمانی که برنامه را به دست کاربر میدهیم «مطمئن» باشیم که همه جوانب برنامه به درستی کار میکنند. چطور میتوانیم به این اطمینان برسیم؟ «تست» برنامه!
برای تست برنامه چه کار باید بکنیم؟ آیا بعد از هر تغییر کوچک در برنامه، از برنامه یک بیلد یا ساخت جدید میگیریم و روی گوشی نصب میکنیم و تمام قسمتهای برنامه را تست میکنیم؟ به نظر کار سختی است. اینطور تمام وقت ما به تست کردن برنامه میگذرد و وقتی برای نوشتن برنامه نمیماند. ایراد دیگر این روش این است که منشا خطاهای بسیار زیادی است. ممکن است بعد از یک تغییر، فقط قسمتی که فکر میکنیم از این تغییرات متأثر شدهاند را تست کنیم ولی جای دیگری در برنامه از کار بیافتد و ما نفهمیم. مشکل دیگر این است که بعضی برنامهها بسیار وسیع هستند و بخشهای بسیار زیادی دارند و در طول زمان توسعه یافتهاند و ممکن است کسی که تغییراتی در برنامه داده است، اصلاً نتواند سایر بخشهای برنامه را به درستی تست کند. مثلاً اپ فیسبوک را ببینید.
چه چیزهایی را باید تست کنیم؟
اول از همه باید مطمئن شویم که همه اجزای برنامه به درستی کار میکنند. بعد از آن باید مطمئن شویم که این اجزای متنوع، در کنار هم و در ارتباط با یکدیگر هم به درستی کار میکنند. بعد باید شرایط استثنایی را برای برنامه تست کنیم. مثلاً اگر اینترنت در دسترس نباشد، اگر حافظه جانبی دستگاه فضای کافی نداشته باشد، اگر کاربر مجوز کاری را به برنامه ندهد، اگر دادهای برای نمایش وجود نداشته باشد و …. بعد از آن باید مطمئن شویم برنامه تحت فشار زیاد چطور کار میکند؟ اگر دادههای غلط و نامعتبر به برنامه بدهیم رفتار آن چطور خواهد بود؟
میبینید که خیلی چیزها را باید تست کنیم! پس باید ابزارها و روشهای صحیح تست برنامهها را بشناسیم و همیشه از آنها استفاده کنیم. اهمیت تست صحیح برنامهها به قدری زیاد است که دهها ابزار برای این کار ساخته شده و صدها کتاب نوشته شده است. این موضوع در دنیای برنامهنویسی آن قدر اهمیت دارد که توسعه برنامه با تست صاحب یک نام اختصاصی شده است: TDD یا Test Driven Development به معنی «توسعه تست محور».
پس باید برای تست برنامه دنبال راهکار صحیح باشیم. در این سری مطالب (که احتمالاً سه یا چهار مطلب خواهد شد)، درباره تست برنامههای اندروید و روشها و ابزارهای آن صحبت خواهیم کرد.
هرم تست برنامه
تستها را میتوان به صورت زیر دستهبندی کرد:
تست واحد یا Unit Test
تست واحد، مجموعهای از تستها است که برای کوچکترین «واحد»های برنامه، یعنی متدها و کلاسها نوشته میشود. میخواهیم مطمئن شویم که همه اجزا یا واحدهای برنامه به درستی کار میکنند. مثلاً اگر متدی داریم که قرار است دو عدد را به عنوان پارامتر بگیرد و حاصل جمع آنها را به ما برگرداند، ما همواره تست میکنیم که ببینیم آیا این متد کاری که قرار است انجام دهد را به درستی انجام میدهد یا نه. بیشترین حجم تست برنامه، همین «تست واحد»ها هستند. نوشتن آنها بسیار ضروری اما بسیار ساده است. اگر همه تستهای واحد با موفقیت انجام شود، ما نمیتوانیم مطمئن شویم که برنامه به درستی کار میکند اما اگر یکی از آنها شکست بخورد، مطمئن میشویم که برنامه در اجرا به مشکل خواهد خورد.
تست یکپارچهسازی یا Integration Test
اگر همه اجزا و واحدهای برنامه به درستی کار کنند، حالا باید بررسی کنیم که آیا این واحدها در کنار یکدیگر هم به درستی کار خواهند کرد؟ آیا بخشهای مختلف برنامه اطلاعات ورودی صحیحی از سایر اجزا دریافت میکند؟ آیا دسترسی اجزای برنامه به هم امکانپذیر است؟
تست کارکردی یا Functional Test
اگر ارتباط همه اجزای برنامه به درستی کار میکند و همه تستهای یکپارچهسازی موفق بودند، حالا باید تست کنیم که ببینیم آیا برنامه کارکرد مورد انتظار را از خود بروز میدهد؟ کاری را که باید انجام دهد به درستی انجام میدهد؟
این انواع تست را در شکل یک هرم میتوان دید:
توضیح ضروری: ممکن است در کتابها و مقالات دیگر، دستهبندیهای متفاوتی ببینید یا اسامی کمی با این دستهبندی ما متفاوت باشد که البته موضوع کمی سلیقهای است. مهم مفهوم مسأله تست برنامه است.
تست برنامههای اندروید
برنامههای اندروید هم از بقیه برنامهها مستثنا نیستند و تست یکی از ضرورتهای آنها است. در اینجا چند اصطلاح و ابزارهای مهم و رایج را معرفی میکنم:
تست واحد
حالا دیگر با مفهوم تست واحد آشنا هستید. در اندروید برای تست واحد معمولاً از ابزارهای متنوعی استفاده میشود که معروفترین آنها JUnit و Robolectric هستند:
JUnit: چارچوبی ساده برای نوشتن تست است که نسخههای متعددی از آن برای زبانهای مختلف وجود دارد و J در ابتدای نام آن اشاره به زبان جاوا است.
Robolecric: روبولکتریک چارچوبی ساده و محبوب برای نوشتن تست واحد در اندروید است. روبولکتریک از JUnit سریعتر است ولی تفاوتهایی با JUnit دارد که در آینده با آنها آشنا خواهید شد.
در این مطالب ما از JUnit استفاده میکنیم.
تست ابزاری
اینها مجموعهای از تستها هستند که رفتار کاربر را تست میکنند. مثلا بر روی یک دکمه کلیک میکند یا متنی را در یک ادیت تکست وارد میکند. برای انجام این تستها باید «زمینه» یا Context اندروید را داشته باشیم و نمیتوان آنها را در ماشین مجازی جاوا اجرا کرد.
ابزارهایی که برای تست ابزاری متداول هستند:
Espresso: چارچوب تست UI که گوگل آن را برای برنامههای اندروید توسعه داده است.
UIAutomator: چارچوب تست UI که گوگل آن را توسعه داده است و از آن برای تست چند برنامه به صورت همزمان استفاده میشود.
Robotium: معادل اسپرسو است که توسط گروه دیگری طراحی شده است.
Selendroid: انشعابی از برنامه بسیار محبوب Selenium است.
ساختار برنامه
برای این که بتوانیم برای برنامه تست بنویسیم و تستها را اجرا کنیم باید تغییراتی در برنامه بدهیم. اگر یک پروژه جدید ادر اندروید استودیو بسازید، به طور پیشفرض دو شاخه در ساختار پروژه میسازد:
androidTest: همه تستهای UI در این شاخه قرار میگیرند.
test: تستهای واحد در این شاخه قرار دارند. این تستها در JVM یا همان ماشین مجازی جاوا اجرا میشوند و نیازی به دستگاه اندروید یا شبیهساز ندارند. در این تستها نمیتوانید از مؤلفههای اصلی اندروید مثل Activity یا Context استفاده کنید.
در مطلب بعدی درباره Unit Testing در اندروید است. با ما باشید!
عالیه لطفا ادامه بدید. واقعا مشتاق ادامه مطلب هستم.
اینکه کدوم ابزار بهتر و راحت تره برای تست و اینکه پروژه رو چطور testable بنویسیم هم سوالیه که همیشه ذهنمو درگیر میکنه.
به زودی با ادامه مطلب به این موضوعات هم میرسیم.
سلام
بسیار عالی . ممنون
سلام ، ممنونم از مطلب خوب و واضحی که نوشتید اکثر این آموزش تست ها بسیار گنگ و نامفهوم هستند اما این پست اینطور نبود
سئوالی هم که بنده دارم اینه که اگر در یک پروژه اون دو فولدر (android test) ,(test) پاک شده باشند چکار باید کرد ؟
باتشکر
سلام ممنون از مطلب زیبا و واضحتون
فقط من بقیه مطالب رو نمیبینم
مطلب مفیدی بود ممنون.
عالی نیازمند چنین مطالبی بودم ممنون