آموزش توسعۀ آزمون محور (TDD) در اندروید – قسمت سوم

نویسنده : سید ایوب کوکبی ۳ فروردین ۱۳۹۸

آموزش توسعۀ آزمون محور (TDD) در اندروید – قسمت سوم

در قسمت اول آموزش TDD دلایل ترس برنامه‌نویسان از ریفکتورینگ را فهمیدید؛ در قسمت دوم با اهمیت خودکارسازی تست، هرم تست و انواع تست‌ها و فریم‌ورک‌های مختلفی که برای این کار ساخته شده‌اند آشنا شدید. در ادامۀ شما را با معماری و پیکربندی پروژه آشنا می‌کنیم و در نهایت چند تست واحد با روش TDD خواهیم نوشت.

معماری پروژه

به منظور خودکارسازی تست ناچاریم از الگوهای خاص معماری برای پروژه استفاده کنیم. این کار به سازماندهی پروژه و تست‌پذیری آن کمک می‌کند. الگوهای معماری فراوانی برای حمایت از TDD وجود دارند از جمله: MVP و MVVM.

ما برای پروژۀ خود از معماری (MVP: Model-View-Controller) استفاده کرده‌ایم.

  1. Model: معمولاً به تعدادی کلاس POJO گفته می‌شود که داده‌های لازم برای لایۀ Presenter و View را فراهم می‌کنند.
  2. View: یک اکتیویتی یا فرگمنت است که داده‌های دریافتی را نمایش می‌دهد. امور مربوط به واسط کاربری در این لایه مدیریت می‌شود.
  3. Presenter: منطق تجاری برنامه و به عبارتی بخش اصلی کدها در این لایه قرار دارد. این لایه داده‌ها را از لایۀ مدل گرفته، آن‌ها را به فرمت مناسبی در می‌آورد و نهایتاً به لایۀ ویو تحویل می‌دهد. تصمیم‌گیری در مورد اینکه چه چیزی به کاربر نشان داده شود به عهدۀ لایۀ Presenter است. تا حد امکان از نوشتن اختصاصی Android SDK در این لایه دوری کنید تا عاری از هر نوع وابستگی باشد. (کار سختی است ولی با تمرین زیاد یاد می‌گیرید).

پیکربندی پروژه

برای آشنایی بهتر بیایید از صفر یک پروژۀ جدید بسازیم. این پروژه یک برنامۀ ساده لاگین و ثبت حضور و غیاب دانش‌آموزان است.

بخوانید  مراحل ساخت کتابخانه اندرویدی

۱٫ اندروید استودیو را باز کرده و گزینۀ Start a new android Project را کلیک کنید؛

۲٫ نام برنامه را StudentAttendance بگذارید و در فیلد Company Domain عبارت nilesh.tdd.com را وارد کنید؛

پروژۀ تمرینی برای tdd

۳٫ آخرین نسخه‌ای از اندروید که می‌توانید ساپورت کنید را انتخاب کرده و Next بزنید

۴٫ قالب Empty Activity را انتخاب و سپس Next کنید.

۵٫ نام اکتیویتی را وارد کنید و دکمۀ Finish را بزنید.

۶٫ ساختار نهایی پروژه باید شبیه این تصویر باشد

نوشتن چند آزمون واحد با رویکرد TDD

برای صرفه‌جویی در زمان، با دستورات پایین کدهای اولیۀ پروژه را از مخزن گیت‌هاب که از قبل آماده کرده‌ایم استخراج کنید:

git clone  https://github.com/NileshJarad/TDD_Demo.git
git checkout 81d1668667bcb5eacf4cf94a8dffe738ad206d67

در صورتی ک بعد از checkout با این خطا مواجه شدید:

ورژن build.gradle را به ۲٫۱٫۲ تغییر دهید (در build.gradle سطح پروژه):

خب حالا همه چیز برای کدنویسی آماده است.

بیایید اولین سناریوی تست را بنویسیم. «اگر کاربری بیش از سه بار برای ورود تلاش کرد به او یک پیام خطا نمایش داده شود».

کلاس com.tdd.nilesh.studentattendance.login.LoginPresenter را باز کنید. نام کلاس را انتخاب کنید و سپس Shift+Ctrl+T بزنید. این کار پنجره‌ای به صورت پاپ‌آپ باز می‌کند که به کمک آن می‌توانید تست جدیدی ایجاد کنید.

وقتی روی آن کلیک کردید در پنجرۀ بعدی به صورت خودکار نام کلاس به همراه کلمۀ Test در انتهای آن انتخاب می‌شود. این شیوۀ نام‌گذاری استاندارد بوده و سعی کنید از همین روش تبعیت کنید.

Ok کنید. دوباره پنجرۀ دیگری سوال می‌کند که کدام فولدر Test. خب اینجا چون قصد نوشتن تست واحد داریم  ../app/src/test/… را انتخاب کنید. حالا یک test class با چنین ساختاری در پروژۀ شما قرار می‌گیرد

بخوانید  آموزش زبان کاتلین – درس 13 (continue)

ما عمداً کدها را تصویری قرار می‌دهیم تا مجبور شوید خودتان کدها را نوشته و تمرین کنید.

عبارت Test@ نشان می‌دهد که متد بعد از آن یک تست است. خب همانطور که می‌بینید متدهای incrementLoginAttempt و isLoginAttemptExceeded  به رنگ قرمز هستند یعنی هنوز وجود ندارند. روی آن‌ها کلیک کنید و Alt+Enter بزنید تا متدها در کلاس Presenter ساخته شوند. (این همان قضیه‌ای است که گفتیم در TDD اول تست و بعد کدهای لازم برای پاس کردن آن تست را می‌نویسیم)

خب طبق مراحل TDD الان باید به اندازه‌ای کد بنویسیم که فقط برنامه اجرا شود و تست fail شود (چراغ قرمز). همانطور که می‌بینید مقدار صفر و false برگردانده‌ایم فقط برای اینکه برنامه قابل اجرا شود و بتوانیم تست را اجرا کنیم. خب حالا باید تست را اجرا کنیم. در نوار سمت چپ تست یک دکمه سبز رنگ وجود دارد آن را بزنید.

خب همانطور که انتظار داشتیم تست پاس نشد. ما انتظار مقدار ۱ داشتیم در حالی که مقدار صفر برگشت داده شد. در واقع اولین test case ما با شکست مواجه شد.

حالا برای پاس کردن این تست، متدها را پیاده‌سازی می‌کنیم؛ به اندازه‌ای که تست‌ها پاس شوند (چراغ سبز)

خب دوباره تست را اجرا می‌کنیم. این بار سبز می‌شود.

تا اینجای کد را می‌توانید از مخزن پروژه در گیت‌هاب checkout کنید:

git checkout 302962ea6f63aa3afba003efa043ebacbaf02345

حالا برای تمرین یک تست کیس دیگر بنویسید. checkIfLoginAttemptIsNotExceeded از نامش پیداست که چه هدفی دارد. یعنی چک کند تعداد لاگین‌ها از حد مجاز بالاتر نیست. اگر با مشکلی برخورد کردید نگران نباشید در commit بعدی می‌توانید پاسخ را ببینید.

بخوانید  15 توصیه به توسعه‌دهندگان جوان اندروید

اکنون می‌خواهیم برای سنجش صحت یوزرنیم و پسورد یک تست بنویسیم.

ابتدا یک تست خالی بنویسید (Failing test)

مثل مراحل قبل روی نام توابع Alt+Enter بزنید و بعد از fail شدن تست سراغ پیاده‌سازی آن بروید:

تست را دوباره اجرا کنید. این بار سبز می‌شود یعنی با موفقیت پاس شده است. حالا خودتان یک تست کیس برای سنجش نادرستی یوزرنیم و پسورد بنویسید. checkUsernameAndPasswordIsInCorrect

برای دریافت کدهایی که تا الان نوشتیم این دستور را در گیت وارد کنید:

git checkout 4771fbfb8c6cbda98d9f01ac5e035ea02f0f5da6

منتظر قسمت بعدی باشید.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *