تست نویسی و استفاده از دیزاین پترن Builder

سلام به همگی

استفاده ی عملی از دیزاین پترن Builder

داشتم برای نرم افزاری که در حال توسعه با زبان Java هستم Integration Test می نوشتم و برای تست ثبت سفارش به یک کاربر با حالت های مختلف از وضعیت اون کاربر نیاز داشتم

سه تا از وضعیت های مختلف یک کاربر از قرار زیر هستند:

  • آیا کاربر ثبت نام شده است یا خیر؟
  • ایا اکانت کاربر تایید شده است یا خیر؟
  • آیا کاربر قرارداد استفاده از نرم افزار را تایید کرده است یا خیر؟

البته حالت های دیگه ای هم هست اما خب من به همین 3 مورد برای شلوغ نشدن متنم کفایت میکنم

خب با همین 3 مورد به تستمون برسیم

چندتا از تست هایی که می نویسیم از قرار زیر هستن:

اگر کاربر لاگین نشده بود (یعنی توکن احراز هویت ارسال نکرده بود) خطای 401 برگردونه
اگر اکانت کاربر تایید نشده بود خطای 403 برگردونه
اگر کاربر قرارداد استفاده از نرم افزار رو تایید نکرده خطای 403 برگردونه
اگر اکانت کاربر تایید شده بود ولی کاربر قرارداد استفاده از نرم افزار رو تایید نکرده بود خطای 403 برگردونه
اگر اکانت کاربر تایید نشده بود ولی کاربر قرارداد رو تایید کرده بود خطای 403 برگردونه
و تست های بعدی که مربوط به سفارش و اکانت هست

همینطور که می بینید ما 5 تا تست برای کاربر با حالت های مختلف نیاز داریم

اول اومدم و خواستم با چند تا متد انجامش بدم ولی دیدم که چقدر ساختن کاربر با وضعیت های مختلف با دیزاین پترن Builder راحت تره

یک کلاس به اسم UserApi دارم که کار های مربوط به کاربر رو انجام میدم. حالا کافیه کلاس Builderام را داخل همین کلاس بنویسم به این صورت:

public static class Builder {
   private String mobile = &quot09122221122"
  private boolean authenticated = false;
  private boolean acceptContract = false;
 
  public Builder setMobile(String mobile) {
  this.mobile = mobile;
  return this;
  }
 
  public Builder authenticated() {
  this.authenticated = true;
  return this;
  }
 
  public Builder acceptContract() {
  this.acceptContract = true;
  return this;
  }
 
  public String buildToken() {
  User user = // create user by mobile …
  if (authenticated)
   // set user authentication status to true
 
  if (acceptContract)
  // set user contract status to true
return // token generated by user details
  }
}


نکته: چون من در نهایت Token کاربر را نیاز دارم Token رو در کلاس Builder می سازم


کلاس Buidler بالا اسکلت بندی مربوط به Builder هست و شما میتونید بر مبنای نیازتون مقادیرش رو کامل کنید.

برای استفاده ازش یک static methodاز کلاس UserApi ساختم:

public static Builder get() {
  return new Builder();
}

البته شما می توانید نیاز ساخت کاربر و Token را به عنوان آرگومانت های ورودی برای کلاس Builder ارسال کنید.

اما مهمترین بخش یعنی استفاده کردن از کلاس Builder که ساختیم

حالا کافیه برای هر تست من کاربر رو بسازم:

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

UserApi.get().buildToken();

یک کاربر با شماره جدید:

UserApi.get().setMobile("09123332211").buildToken();

یک کاربر که ثبت نام کرده و تنها اکانت کاربری اش تایید شده است:

UserApi.get().authenticated().buildToken();

یک کاربر که تنها قرارداد استفاده از نرم افزار را تایید کرده است:

UserApi.get().acceptContract().buildToken();

یک کاربر که علاوه بر اینکه اکانتش تایید شده است، قرارداد استفاده از نرم افزار را نیز تایید کرده است:

UserApi.get().authenticated().acceptContract().buildToken();


همونطور که میبینید به یک یا چند کاربر با وضعیت های مختلف دسترسی داریم و به راحتی می توانیم تستمون رو انجام بدیم.

پ.ن: من توی این نوشته دیزاین پترن رو آموزش ندادم. تنها نحوه و مزیت استفاده از اون رو توی این مثال خاص توضیح دادم