تست واحد یکی از داغترین مباحث در روش Agile در کنار موارد دیگر مانند integration testing, CI, CD و غیره است.
تست واحد چیست؟
براساس ویکیپدیا، تست واحد یک روش تست براساس واحدهای جداگانهی کد است، که مجموعهای از یک یا چند ماژول برنامهی کامپیوتری به همراه دادههای کنترلی همراه، روشهای استفاده و روشهای عملیاتی برای تعیین اینکه آیا مناسب برای استفاده هستند تست میشوند.
به عبارت دیگر، یک قطعه کد است که برای تست کردن کد دیگری نوشته شده است، مانند کد لایهی presenter در الگوی معماری Model-View-Presenter.
اگر کد تمام تستهای خود را پشت سر بگزارد به integration testing منتقل میشود. وقتی کد تمام تستهای خود را پشت سر گذاشت، میتوانیم بگوییم که کامل شده است. در نتیجه تست واحد مزایای زیادی خواهد داشت مانند یافتن اشکالات نرمافزار در ابتدای توسعه، اصلاح آسان کدهای قدیمی و منبع مستندات.
تست واحد کوچکترین قطعه کد "ایزوله" را تست میکند و همچنین تست میکند که با گذر از برخی از تستها صحیح کار میکند. در طول تست واحد، همهی وابستگیهای آن قسمت از کد توسط برخی از frameworkها مانند mokito ارائه میشود.
چه زمانی کد قابلیت تست واحد را دارد؟
همهی کدها قابلیت تست واحد را ندارند. قطعه کدی قابل تست است که فقط اگر وابستگیهای آن توسط تزریق وابستگی ارائه شده باشد، و یا بتوان توسط frameworkهای تقلید، آن را تقلید کرد.
برای مثال به کد زیر نگاه کنید:
public String doSomething(Date someDate){
Date date = new Date();
if(date.isAfter(someDate)){
return "tomorrow";
}else if(date.isBefore(someDate)){
return "Yesterday";
}else{
return "Equal";
}
}
ما یک نمونهی جدید از شیء Data میسازیم که به ما تاریخ امروز را میدهد. ما تاریخ امروز را با تاریخ یک شی دیگر "someData" مقایسه میکنیم.
این رفتار غیرقطعی است. هر نمونه از اجرای این کد یک شیء جدید از امروز را ارائه میدهد، از این رو نوشتن تستهای واحد برای این کد امکان پذیر نیست.
حال یه این کد نگاه کنید:
public String doSomething(Date source, Date someDate){
if(source.isAfter(someDate)){
return "Tomorrow";
}else if(source.isBefore(someDate)){
return "Yesterday";
}else{
return "Equal";
}
}
این دقیقا یک تست واحد برای این متد است:
@Test
public void comparing7thwith10th_returnsyesterday() throws Exception {
try{
Date date = new date();
asserEquals(doSomething(new Date(),new Date()),"Equal");
}catch(Exception e){
}
}
این یک کار خوب نیست که وابستگی را در کلاس مستقر کنید. وابستگیها باید خارج از کلاس ارائه شود از این رو کلاس را تست میکنند. به همین دلیل است که مفهوم تزریق وابستگی این روزها در جریان است.
مزایای تست واحد
تست واحد مزایای زیادی دارد از قبیل یافتن اشکالات نرمافزار در ابتدای توسعه، ساده کردن اصلاح کدها، سادهسازی ادغام، ارائهی مستندات و غیره است. اکنون با جزئیات بیشتری به آنها خواهیم پرداخت.
دنبال کردن روش Agile
وقتی که شروع به اضافه کردن ویژگیهای بیشتر و بیشتر به برنامهی خود میکنید، ممکنه که نیاز داشته باشید کد قدیمی را تغییر دهید. اما این کار بسیار پر هزینه و پر خطر است. همچنین شما ممکنه که یک قابلیت را تمام کنید و سپس دوباره زمانی را برای پیدا کردن اشکالات و رفع خطاها بگذارید.
این روند خسته کننده است و ممکنه برای شرکت پرهزینه باشد.
اگر تستهای واحد اکنون موجود هستند. هیچ راهی برای شکستن عملکرد قدیمی وجود ندارد(مگر اینکه خودتان بخواهید :/). اگر خطایی در قسمتی از کد وجود داشته باشد، شما هنگامی که تست واحد را اجرا کنید خواهید فهمید. این یک روش self-policing است که در طولانی مدت سردردهای شما را کمتر میکند. تستهای واحد باید قبل از نوشتن بقیهی کدها نوشته شود.
کیفیت کد
نوشتن تست واحد باعث میشود در مورد مواردی مانند الگوی طراحی و معماری کد خود سختتر فکر کنید. در نتیجه، شما به نوشتن کد با کیفیتی میپردازید که ظریف، آسان برای خواندن و مهمتر از همه آسان برای اصلاح در اینده است.
این هدف اصلی همهی معماریها الگوهای طراحی است. برای اینکه کد ماژولارتر و قابل تست باشد.
پیدا کردن اشکالات در ابتدا
تست واحد قبل از ادغام آن با کد اصلی انجام میشود. بنابراین، اگر کد شما دارای یک رفتار غیر منتظره باشد، میتوانید قبل از ادغام با کد قبلی آنرا مشاهده کنید. این کار بعدا وقتی کد خود را با کد اصلی ادغام کردید، از سردردهای زیادی جلوگیری میکند.
این کار فرایند یکپارچهسازی و integration test را بسیار سادهتر میکند.
ارائهی مستندات
تست واحد میتواند مستنداتی برا کد شما ارائه دهد. توسعهدهندههایی که میخواهند ببینند که قسمتی از کد چه کاری انجام میدهد میتوانند با نگاه کردن به تستهای واحد، عملکرد آن بخش را درک کنند.
فرایند اشکالزدایی
تست واحد اشکالات کمتری را تضمین میکند و اشکالزدایی را آسان تر میکند. شما باید تستهای واحد را به طور مداوم انجام دهید تا مطمئن شوید هیچ تستی از کار نمیافتد.
اگر تستی انجام نشود، در کد موجود شما مشکلی وجود دارد و به یک بررسی دیگر نیاز دارد.
شما را یک پله بالاتر از دیگران میبرد
نوشتن تست واحد شوخی نیست!!! این یک کار خسته کننده است و نیاز به تلاش بیشتری نسبت به خود کد واقعی دارد. اما این باعث میشود فکر کنید و در دراز مدت پربارتر شوید.
بنابراین اگر میخواهید یک مهندس نرمافزار خوب باشید و در زمینهی اصلی خود کار کنید، داشتن مهارت در زمینهی تست واحد ارزشمند است و یک مزیت نسبت به همسالان خود میباشد.
این باعث میشود رزومه کاری شما از دیگران متمایز شود و درنهایت شانس شما برای آن شغل را افزایش میدهد.
کاهش هزینه
اشکالات را میتوان در مراحل اولیه و قبل از ادغام کد یافت. پیدا کردن اشکالات بعدا در کل کد واقعا کار سختی است، اشکالات شناسایی شده بعدا نتیجهی تغییرات زیادی است و شما نمیدانید کدام است.
یافتن اشکالات بعدا منجر به زمان توسعهی بیشتر و در نهایت افزایش هزینه خواهد شد.
تست واحد در اندروید
تست واحد مختص به یک پلتفرم خاص نیست. بلکه برای همهی زبانها و پلتفرمها موجود است، اما چون این یک مقالهی اندرویدی است بیایید در مورد تست واحد در اندروید صحبت کنیم.
(Android testing support library(ATSL چهاچوبی عالی برای تست برنامهی شما ارائه میدهد. که دارای Junit ۴،(AndroidJUnitRunner)compatible test runner و تست کاربردی Ui از طریق Espresso و Ui Automator.
این تستها میتوانند مستقیما در اندروید استدیو از طریق خط فرمان اجرا شوند.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید