ریزکاریهای تست جنگو با TransactionTestCase و TestCase

در پست قبل دیدیم که برای نوشتن تست در جنگو میتونیم از کلاس های django.test.TestCase و django.test.TransactionTestCase استفاده کرد (البته که از خود unittest پایتون هم می توان استفاده کرد اما این کار در جنگو منطقی نیست چرا که کلاسهای تعریف شده برای تست در جنگو قابلیت های زیادی برای تست اضافه کرده اضافه کرده. مثلا اگر با unittest پایتون استاندارد بخاید تستی بنویسید که نیاز به دسترسی دیتابیس یا اجرا اپلیکیشن وب داشته باشد قطعا به مشکل میخورید بنابراین هیچ کس این کار رو نمیکنه). دیدیم که یک کلاس دیگه به اسم django.test.LiveTestCase هم وجود داره که میتونید توی اون از کلاینت Selenium استفاده کنید که تست های لایو توی مرورگر رو داشته باشید.

سوالی که پیش میاد اینه که فرق TestCase و TransactionTestCase چیه؟ توی خود کد جنگو نوشته:

میگه هردو مثلا همه و توی بیشتر شرایط باید TestCase رو ترجیح بدید چون سریع تره مگر در شرایطی خاص باید TransactionTestCase رو استفاده کنید مثلا اونجا که تستی که مینویسید تراکنش به دیتابیس داره و باید انجام بشه. میگه توی دیتابیسی که از تراکنش پشتیبانی نمیکنه عملا هر دو یکی هستن مثلا دیتابیس MySQL با موتور MyISAM.

توی مستندات جنگو گفته که TransactionTestCase از SimpleTestCase ارثبری کرده و چنتا قابلیت استفاده کرده. مثلا دیتابیس رو بعد از هر متد تست به حالت تعریف شده بر میگردونه که این توی تست مهمه مثلا 100 تا تابع تست داریم باید بعد از هر کدوم دیتابیس ریست بشه که روی تست های دیگه تاثیر نذاره. TransactionTestCase اطلاعات رو ممکنه commit و rollback کنه و بعد از هر تست هم حتما دیتابیس رو truncate میکنه اما TestCase برای سرعت بیشتر truncate نداره و از تراکنش ها استفاده میکنه یعنی rollback میکنه. این کار باعث میشه توی تستهای که نیاز به تراکنش هست به مشکل بخورید مثلا select_for_update ها.

در کل چیزی که من تجربه کردم اگر توی توابع تست یک کلاس تستکیس، update یا insert دیتابیس دارید از TransactionTestCase استفاده کنید. اگر فقط select دارید از TestCase استفاده کنید که سرعت بیشتری داره. اگر کلا با دیتابیس کاری ندارید از SimpleTestCase استفاده کنید.

دیدگاهتان را بنویسید

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