آموزش unit Test در اندروید
سلام دوستان، شما می توانید برنامه های اندروید را بنویسید یا کدنویسی کنید. اما آیا آنها را آزمایش می کنید؟ بله، می دانم که همه برنامه را کامپایل می کنند و می بینند، کار می کند یا نه. اما آیا برای تست کد می نویسید؟ آیا شما هر تابع و هر ماژول را تست می کنید؟ اگر پاسخ شما خیر است، این آموزش تستUnit اندروید را از دست ندهید. در این مقاله یاد خواهید گرفت که اولین تستUnit خود را بنویسید. پس بدون اتلاف وقت، بیایید شروع کنیم.
Unit تست چیست؟
تست Unit یک روش تست است که در آن Unit (واحد های) جداگانه (یا کوچکترین واحد) کد برنامه را آزمایش می کنیم تا اطمینان حاصل شود که آنها به درستی کار می کنند.
تست Unit کمک می کند تا تأیید شود که هر واحد کد برنامه همانطور که انتظار می رود کار می کند.
اغلب تست های Unit حتی قبل از نوشتن کد نوشته می شوند. به عبارت دیگر، برای هر تابعی که قرار است ایجاد شود، یک تست واحد قبل از نوشتن تابع نوشته می شود. با پیروی از این روش، میتوانیم bug های احتمالی را در مراحل اولیه توسعه برطرف کنیم.
مزایای Unit تست
- به یافتن زودهنگام bug کمک می کند.
- هنگامی که به یافتن اشکالات در مراحل اولیه توسعه کمک می کند ، هزینه و زمان توسعه را کاهش می دهد.
- بازسازی ساده تر می کند و مستندات را فراهم می کند.
تست Unit مخصوص هیچ پلتفرمی مانند اندروید یا وب نیست. مفهومی است که در توسعه نرم افزار استفاده می شود. اما در اینجا، تمرکز ما انجام تستهای Unit در پروژههای اندرویدی است.
آموزش Unit تست در اندروید
هر زمان که یک پروژه اندرویدی ایجاد می کنید، این سه package را خواهید کرد.
همانطور که می دانید در داخل پکیج اصلی (اول) همه کدهای اپلیکیشن خود را قرار می دهیم. اما ما دو پکیج دیگر نیز داریم.
اکنون در مورد پکیج AndroidTest بحث نمی کنیم. هدف امروز ما فقط پکیج test است. داخل این پکیج تمام کدهای Unit Test را می نویسیم.
حالا به فایل build.gradle(app-level) بروید و قسمتdependencies را ببینید..
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
در اینجا می بینید که testImplementation و androidTestImplementation داریم. testImplementation کتابخانه های موجود در پکیج test هستند. و به همین ترتیب اگر میخواهید کتابخانه در پکیج AndroidTest در دسترس باشد، باید از androidTestImplementation استفاده کنید.
اکنون، Java Unit Testing Framework JUnit به طور پیش فرض در اینجا اضافه شده است. هر زمان که پروژه ای ایجاد می کنید به طور پیش فرض اضافه می شود. ما از JUnit برای تست unit کد خود استفاده خواهیم کرد.
با JUnit از Google Truth برای ساده کردن اثبات ها (assertions) استفاده خواهیم کرد. از آنجایی که به طور پیش فرض در دسترس نیست. باید آن را داخل بلوک dependency فایل build.gradle(app-level) اضافه کنیم.
testImplementation "com.google.truth:truth:1.1.2"
کد برای تستUnit
در این مثال، یک تابع بسیار ساده داریم که آن را با روش unitTest ، تست می کنیم.
object Validator {
fun validateInput(amount: Int, desc: String): Boolean {
return !(amount <= 0 || desc.isEmpty())
}
}
یک کد بسیار ساده را مشاهده می کنیم. این تابع ، پارامترهای داده شده را validate (اعتبار سنجی) می کند. قوانین به صورت زیر است.
- amount باید بزرگتر مساوی صفر باشد.
- desc نباید خالی باشد.
اگر پارامترهای داده شده شرایط را برآورده کنند، مقدار true را برمی گردانیم، به این معنی که ورودی ها معتبر هستند. برای هر مورد دیگر، ما false را برمی گردانیم، به این معنی که ورودی های داده شده معتبر نیستند.
اکنون باید این تابع را آزمایش کنیم تا مطمئن شویم که این تابع همانطور که انتظار می رود کار می کند.
برای تست این تابع یک فایل تست داخل پکیج تست ایجاد می کنیم. می توانید فایل را به صورت دستی ایجاد کنید یا این مراحل را دنبال کنید.
- روی کلاسی که باید تست شود کلیک راست کنید.
- به generate بروید و سپس Test را انتخاب کنید.
- حالا JUnit4 را انتخاب کرده و ok را بزنید.
نوشتن Unit Test
در نهایت بر روی تابع validateInput خود تست Unit انجام می دهیم.
@RunWith(JUnit4::class)
class ValidatorTest{
@Test
fun whenInputIsValid(){
val amount = 100
val desc = "Some random desc"
val result = Validator.validateInput(amount, desc)
assertThat(result).isEqualTo(true)
}
@Test
fun whenInputIsInvalid(){
val amount = 0
val desc = ""
val result = Validator.validateInput(amount, desc)
assertThat(result).isEqualTo(false)
}
}
حالا اینجا کلاس داریم. که شامل تمام توابع برای آزمایش Validator است. هر کلاس Unit test باید با @RunWith(JUnit4::class) حاشیه نویسی شود (JUnit4::class چون ما از JUnit4 استفاده می کنیم، می توانید آن را با هر نسخه ای که می خواهید استفاده کنید تغییر دهید). در داخل این کلاس، توابع تست را برای آزمایش تمام سناریوها می نویسیم. از آنجایی که این فقط یک مثال است، ما فقط دو مورد آزمایشی داریم. یکی برای ورودی معتبر و دیگری برای ورودی نامعتبر است.
نکته دیگری که باید به آن توجه کنید این است که باید تمام function های آزمایشی خود را با @Test حاشیه نویسی کنید. اکنون در اینجا می توانید ببینید که ما دو function داریم.
whenInputIsValid(): این تابع برای تست حالتی است که ما ورودی معتبری را برای تابع خود ارائه می دهیم. بنابراین کاری که ما در اینجا انجام می دهیم این است که ما فقط تابع validateInput() را فراخوانی می کنیم و یک ورودی معتبر ارسال می کنیم. اکنون ما اثبات می کنیم که مقدار برگشتی درست است.
WhenInputIsInvalid(): در اینجا نیز همان کار بالا را انجام می دهیم. تنها تفاوت این است که این بار ورودی نامعتبر را ارسال می کنیم و اثبات می کنیم که نتیجه برابر با نادرست است.
برای اجرای تست می توانید از دکمه های play در Android Studio استفاده کنید. دکمه play را قبل از هر function و class خواهید دید.
اگر تست را run کنید، آن را در حالت قبولی(pass) در تست خواهید دید. اگر تست ناموفق بود، باید تغییراتی در function خود ایجاد کنید.
بنابراین هر زمان که چیزی را در function تغییر دادید، باید دوباره آن را آزمایش کنید. و به این ترتیب، کد شما با تغییرات بعدی با شکست مواجه نمی شود زیرا همیشه باید ابتدا تست را پشت سر بگذارد.
امیدوارم از این مقاله لذت برده باشید . موفق باشید.
دیدگاهتان را بنویسید