معرفی
«تستانجی» (TestNG) یک فریمورک متنباز برای نوشتن و اجرای تستهای خودکار در پروژههای جاوا است. نام آن از عبارت Test Next Generation گرفته شده است و برای تست واحد، تست یکپارچهسازی و سناریوهای پیچیدهتر به کار میرود.
توسعهدهندگان و مهندسان تست با استفاده از حاشیهنویسیها (Annotations)، متدهای راهاندازی و پاکسازی، گروههای تست و وابستگی میان تستها، اجرای مجموعههای تست (Suite) را مدیریت میکنند. TestNG میتواند تستها را بهصورت ترتیبی یا موازی اجرا کند و گزارش خروجی ارائه دهد.
TestNG یا JUnit، چگونه انتخاب کنید؟
اگر پروژه شما از JUnit استفاده میکند و تیم به قابلیتهایی مانند گروهبندی تستها، Data Provider یا پیکربندی مجموعههای تست مستقل نیاز ندارد، ادامه استفاده از همان فریمورک هزینه کمتری دارد. مهاجرت صرفا برای تغییر فریمورک میتواند به تغییر کد تستها، افزونههای محیط توسعه، پیکربندی ساخت و خط لوله یکپارچهسازی مستمر نیاز داشته باشد.
TestNG زمانی انتخاب مناسبی است که تیم بخواهد:
سناریو را با ورودیهای مختلف اجرا کند.
مجموعههای تست اسموک (Smoke Test) و رگرسیون را جداگانه انتخاب کند.
نحوه اجرای مجموعههای تست را با جزئیات بیشتری پیکربندی کند.
برای نمونه، تیمی که پیش از انتشار فقط تستهای دود را اجرا میکند و در اجرای شبانه به سراغ تستهای رگرسیون میرود، میتواند این دو مجموعه را با گروههای TestNG از هم جدا کند.
پیش از انتخاب فریمورک، پشتیبانی افزونههای محیط توسعه، ابزار ساخت، سیستم گزارشگیری و تنظیمات خط لوله پروژه را بررسی کنید. در پروژههای جدید، تست نمونهای را در محیط واقعی تیم اجرا کنید. اگر به پیکربندیهای پیچیده نیاز ندارید، JUnit نیز میتواند انتخاب مناسبی باشد.
محدودیتهای مهم در طراحی تست
وابسته کردن تستها به یکدیگر ممکن است برای اجرای مرحلههای جریان پیوستهای مفید باشد، اما برای تستهای مستقل انتخاب مناسبی نیست. برای مثال، اگر شکست تست ورود باعث رد شدن تمام تستهای بعدی شود، تشخیص علت اصلی مشکل دشوارتر خواهد شد.
وابستگی میان دو تست زمانی توجیه دارد که مرحله بعد بدون خروجی مرحله قبل معنایی نداشته باشد. در غیر این صورت، دادهها و وضعیت موردنیاز هر تست را به صورت مستقل آماده کنید.
اجرای موازی زمانی سودمند است که تستها، دادههای آزمایشی و محیط اجرا با یکدیگر تداخل نداشته باشند. اگر چند تست یک حساب کاربری، رکورد پایگاه داده یا مرورگر مشترک را تغییر دهند، اجرای موازی میتواند باعث شکستهای ناپایدار شود. پیش از فعال کردن اجرای موازی، تستها را چند بار به صورت همزمان اجرا کنید و برای هر اجرا، داده یا محیط مجزایی در نظر بگیرید.
جایگاه TestNG در بازار کار ایران
در آگهیهای مرتبط با توسعه جاوا، مهندسی تضمین کیفیت و خودکارسازی تست، مهارتهایی مانند جاوا، سلنیوم، تست خودکار و یکپارچهسازی مستمر مطرح میشوند. TestNG در این مسیر عنوان شغلی مستقلی نیست بلکه مهارتی مکمل برای اجرا و سازماندهی تستها به شمار میرود.
داده قابلاتکایی برای سنجش میزان استفاده از TestNG در شرکتهای ایران در دسترس نیست. بنابراین، برای انتخاب این ابزار، مخزن کد و استانداردهای تیم هدف را بررسی کنید.
TestNG در پروژههای جاوا که به پیکربندی دقیق اجرای تست، دستهبندی سناریوها یا اجرای موازی نیاز دارند، کاربرد دارد. این ابزار در کنار Maven یا Gradle و در خط لوله یکپارچهسازی مستمر استفاده میشود. همچنین میتوان از آن در کنار سلنیوم برای خودکارسازی رابط وب استفاده کرد، اما جایگزین سلنیوم نیست.
این ابزار را با نامهای دیگری نیز میشناسند:
- تست ان جی
- Test Next Generation
ویژگیهای کلیدی
موارد زیر تصویری کلی از این بخش برای این ابزار ارائه میکنند.
-
تستنویسی مبتنی بر حاشیهنویسیها
با حاشیهنویسیهایی مانند @Test و @BeforeMethod و @AfterMethod، رفتار و چرخه اجرای تستها در خود کد مشخص میشود.
-
گروهبندی و انتخاب تستها
میتوانید تستها را در گروههایی مانند smoke یا regression یا integration قرار دهید و فقط گروه موردنظر را اجرا کنید.
-
وابستگی میان تستها
میتوان اجرای متد یا گروه را به موفقیت مرحله پیشین وابسته کرد. این قابلیت برای مراحل پیوسته مناسبتر از تستهای مستقل است.
-
اجرای موازی
با پیکربندی suite میتوان کلاسها، متدها یا نمونههای داده را به صورت موازی اجرا کرد. البته به شرطی که داده، محیط اجرا و خود تستها با هم تداخل نداشته باشند.
-
تست دادهمحور
Data Provider اجازه میدهد متد تست با مجموعههای مختلف ورودی اجرا شود. این قابلیت برای اعتبارسنجی حالتهای متعدد مفید است.
-
پیکربندی مجموعه تست با XML
فایل «testng.xml» برای انتخاب کلاسها، گروهها، پارامترها، ترتیب اجرا و تنظیم اجرای موازی بهکار میرود.
-
گزارش اجرای تست
پس از اجرا، گزارشهایی از تستهای موفق، ناموفق و ردشده تولید میشود تا بررسی خطاها و وضعیت اجرای مجموعه تست آسانتر شود.
کاربردها
برای آشنایی بهتر با این ابزار، توجه به موارد زیر میتواند مفید باشد.
-
تست واحد سرویسهای Java
برای بررسی رفتار متدها و کلاسهای لایه سرویس، اعتبارسنجی ورودیها و منطق کسبوکار در یک پروژه Java.
-
اجرای تستهای رگرسیون
برای جداکردن مجموعه تستهای رگرسیون از تستهای سریع و اجرای آنها پیش از انتشار نسخه جدید.
-
تست دادهمحور API یا منطق برنامه
برای اجرای یک سناریوی تست با ورودیهای معتبر، نامعتبر و مرزی، بدون تکرار دستی کد تست.
-
خودکارسازی تست رابط وب
برای سازماندهی سناریوهای Selenium، اجرای آنها در گروههای مختلف و راهاندازی یا پاکسازی مرورگر پیش و پس از تست.
-
اجرای تست در CI
برای اجرای خودکار suite-های مشخص در Maven یا Gradle و اعلام شکست تست در فرایند یکپارچهسازی مستمر.
-
اجرای TestNG در Jenkins
اگر پروژه از Jenkins استفاده میکند، میتوان مرحله ساخت را طوری تنظیم کرد که دستور Maven یا Gradle اجرا شود و شکست تستهای TestNG باعث ناموفقشدن همان build شود.
پرسشهای رایج درباره تستانجی
در این بخش، به تعدادی از پرسشهای رایج درباره این ابزار پاسخ داده شده است.
TestNG چیست و برای چه زبانی استفاده میشود؟
TestNG فریمورک تست خودکاری برای Java است. با آن میتوانید تست واحد، یکپارچهسازی و سناریوهای دادهمحور بنویسید و اجرا کنید.
تفاوت TestNG و JUnit چیست؟
هر دو برای تست Java کاربرد دارند. TestNG امکاناتی مانند گروهبندی تست، وابستگی میان تستها، Data Provider و پیکربندی suite با XML را برجستهتر ارائه میکند. اگر تیم از JUnit استفاده میکند و به این قابلیتها نیاز مشخصی ندارد، بیشتر اوقات، مهاجرت ارزش هزینه تغییر کد، افزونهها و تنظیمات CI را ندارد.
آیا TestNG جایگزین Selenium است؟
خیر. Selenium ابزار خودکارسازی مرورگر است، اما TestNG اجرای تستها، چرخه راهاندازی و پاکسازی، گروهبندی و گزارشگیری را مدیریت میکند. به طور معمول، این دو کنار هم استفاده میشوند.
آیا برای یادگیری TestNG باید Java بلد باشم؟
بله، از آنجا که این فریمورک مخصوص اکوسیستم جاوا است، تسلط بر مبانی این زبان برنامهنویسی ضرورت دارد.
فایل testng.xml چه کاربردی دارد؟
این فایل برای تعریف suite تست بهکار میرود. در آن میتوانید کلاسها، گروهها، پارامترها، listener-ها و شیوه اجرای موازی را تنظیم کنید.
آیا وابستگی میان تستها در TestNG کار خوبی است؟
خیر، وابستگی بیش از حد تستها توصیه نمیشود و بهتر است هر تست به صورت مستقل و با دادههای مجزا اجرا گردد. فقط وقتی مناسب است که مرحله بعد بدون نتیجه مرحله قبل قابلاجرا نباشد. اما برای تستهای مستقل، وابستگی میتواند شکستهای زنجیرهای ایجاد کند و علت اصلی خطا را پنهان کند.
آیا اجرای موازی TestNG همیشه زمان تست را کم میکند؟
خیر، اگر تستها با یکدیگر تداخل منابع داشته باشند، اجرای موازی میتواند باعث شکستهای ناپایدار و خطا شود.