سطح ورودی آزمون آنلاین جاوا. تست برنامه، JUnit. پیش نیازهای تست جاوا

من معتقدم که توسعه نرم افزار فراتر از یک شغل است. من خودم را صنعتگری می بینم که هر روز سعی می کند بهتر شود. "ساده ترین" راه برای انجام این کار این است که چند ابزار خوب پیدا کنید و به سوالات زیر پاسخ دهید:

  • چه زمانی باید از ابزار X استفاده کنم؟
  • چگونه باید از ابزار X استفاده کنم؟

تست خودکار بخش بسیار مهمی از توسعه نرم افزار است، اما پست های کمی در وبلاگ برنامه نویسان در مورد ابزارهای مورد استفاده وجود دارد. همین مقاله به شما این امکان را می دهد که به "جعبه ابزار" من نگاه کنید. من 12 کتابخانه و چارچوبی را که برای نوشتن آزمون‌های واحد و یکپارچه‌سازی استفاده می‌کنم پوشش می‌دهم و پیوندهایی به صفحات ارائه می‌دهم که به شما در درک نحوه استفاده از آنها کمک می‌کند.

بیایید به جعبه ابزار من نگاه کنیم

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

  • تست یکپارچه سازی با Maven توضیح می دهد که چگونه می توانیم یک ساخت Maven را با تست های یکپارچه سازی و واحد در دایرکتوری های مختلف راه اندازی کنیم.
  • شروع به کار با Gradle: تست یکپارچه سازی با افزونه TestSets برای Gradle نیز یکسان است.

اکنون شما آماده هستید تا نگاه دقیق تری به ابزارهای من بیندازید. من آنها را به دسته‌هایی تقسیم کرده‌ام تا حرکت را برای شما آسان‌تر کنم.

بنابراین، در اینجا 12 ابزاری وجود دارد که من برای یکپارچه سازی و تست واحد استفاده می کنم.

در حال اجرای تست ها

AssertJ یک API انعطاف‌پذیر برای نوشتن اظهارات با پیام‌های خطای مفید ارائه می‌کند، خوانایی کد تست را بهبود می‌بخشد و به شما امکان می‌دهد تست‌ها را به مشخصات اجرایی تبدیل کنید که به زبان خاص دامنه مورد نظر پایبند هستند.

علاوه بر این:

  • استفاده از Hamcrest در تست نحوه استفاده از Hamcrest برای نوشتن تست ها و همچنین نحوه گسترش قابلیت های آن با ماژول های سفارشی را پوشش می دهد.
  • تبدیل ادعاها به یک زبان خاص دامنه نحوه ایجاد ادعاهای سفارشی در AssertJ را توضیح می دهد.
  • نوشتن تست های پاک: جایگزینی ادعاها با زبان اختصاصی دامنه. توضیح می دهد که چرا باید اظهارات استاندارد JUnit را با ادعاهای خودمان جایگزین کنیم که از زبان مناسب دامنه خاص استفاده می کنند.

تست کد دسترسی به داده ها

پایگاه داده سریع، مفید برای نوشتن تست های یکپارچه سازی که روی آن اجرا می شوند ماشین محلیتوسعه دهنده

پسوندی برای JUnit که می تواند برای مقداردهی اولیه پایگاه داده به یک وضعیت شناخته شده قبل از اجرای هر آزمون یکپارچه سازی و پر کردن پایگاه داده با داده های لازم استفاده شود. DbUnit معایب خود را دارد، اما بسیار است ابزار مفید، که به شما امکان می دهد داده های تست و کد تست را جدا کنید.

علاوه بر این:

  • اجزای کلیدی DbUnit را توضیح می دهد که برای نوشتن تست با استفاده از DbUnit باید بدانید.
  • پنج قانون برای نوشتن بهترین تست ها برای کد دسترسی به داده ها ارائه می دهد.

در حالی که به دنبال کارهای آزمایشی برای برنامه نویسان جاوا بودم، به سایت جالبی برخوردم (کاربران Avast نباید بروند، یک تروجان اسکریپت شناسایی شده است، دیگران ظاهرا خوب هستند) - http://www.betterprogrammer.com. صلاحیت برنامه نویسان جاوا را به ساده ترین روش آزمایش می کند، اما به صورت خودکار: ارائه چندین تابع (روش) با افزایش پیچیدگی و کپی کردن کد در TextArea. در مرحله بعد، موتور سایت کاری را با وظایف انجام می دهد (نه کمتر از یک آزمون واحد)، یک شاخص صلاحیت مشخص را بر اساس معیارهای "سرعت-کیفیت" محاسبه می کند و نمره نهایی را به شکل زیر می دهد:

سپس سوالات شروع می شود. من خودم برای دومین بار در زندگی ام در جاوا برنامه نویسی کردم (و بنابراین به سادگی از کارهای پیچیده رد شدم)، بنابراین 82٪ در این آزمون با سطح مطابقت دارد برنامه نویس غیر جاوا. پس چقدر باید جاوا جونیور، برنامه نویس جاوا و حتی بیشتر جاوا ارشد استخدام کنند؟! از چه نتیجه ای می توان انتظار داشت حاضربرنامه نویس جاوا - 90، 95، 99؟ و در نهایت، اگر "برنامه نویس" نمره کمتر از 82 بگیرد، اما با این وجود برای نوعی شغل اقدام کند، چه؟

تست کردن همیشه سرگرم کننده و جالب نیست. این فرآیند معمولاً طولانی و گاهی اوقات پر از کارهای یکنواخت است. به نظر می رسد که اخیراً برنامه نویسان از خروجی استاندارد یا یک دیباگر برای آزمایش کلاس های جاوا استفاده کرده اند.

در این مقاله کتابخانه JUnit 4 را توضیح خواهم داد که فرآیند نوشتن تست ها را بسیار ساده و خودکار می کند.

برای نشان دادن قابلیت های اصلی JUnit Framework، بیایید یک کلاس ابتدایی در جاوا بنویسیم و آن را مسخره کنیم. این کلاس دو روش خواهد داشت - یافتن فاکتوریل یک عدد غیر منفی و مجموع دو عدد. علاوه بر این، نمونه کلاس حاوی شمارنده فراخوانی متد خواهد بود.

کلاس عمومی MathFunc ( فراخوانی های int; getCalls عمومی int () ( تماس های برگشتی؛ ) عمومی طولانی فاکتوریل (شماره int) ( calls++; if (شماره 1) (برای (int i = 1; i

حالا بیایید تست های واحد را بنویسیم. برای این کار یک کلاس با تعدادی روش تست ایجاد می کنیم. طبیعتاً یک کلاس می تواند شامل متدهای کمکی معمولی نیز باشد. برای اینکه دونده آزمون تشخیص دهد که چه کسی کیست، روش های تست باید با @Test حاشیه نویسی شوند.

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

  • انتظار می رود - نشان می دهد که کدام استثنا توسط روش ایجاد می شود (به مثال زیر مراجعه کنید).
  • تایم اوت - بعد از چند میلی ثانیه آزمایش متوقف می شود و آن را ناموفق حساب می کند.

اگر می خواهید نشان دهید که یک آزمایش خاص باید نادیده گرفته شود، آن را با حاشیه نویسی @Ignore علامت گذاری کنید. اگرچه می توانید به سادگی حاشیه نویسی @Test را حذف کنید.

ممکن است زمان‌هایی وجود داشته باشد که برای اجرای هر تست به زمینه‌ای نیاز داشته باشید، مانند نمونه‌های کلاس از قبل ایجاد شده. و پس از اجرا باید منابع رزرو شده را آزاد کنید. در این مورد به حاشیه‌نویسی‌های @Before و @After نیاز خواهید داشت. متد با علامت @Before قبل از هر تست و متدی با علامت @After بعد از هر تست اجرا خواهد شد.

اگر لازم است مقداردهی اولیه و انتشار منابع فقط یک بار انجام شود - به ترتیب، قبل و بعد از همه آزمایش‌ها - از یک جفت حاشیه نویسی @BeforeClass و @AfterClass استفاده کنید.

و این هم خود کلاس تست با چندین اسکریپت تست:

کلاس عمومی MathFuncTest ( ریاضی MathFunc خصوصی؛ @Before public void init() ( math = new MathFunc(); ) @After public void tearDown() ( math = null; ) @Test public void calls() ( assertEquals(0, math .getCalls()); math.factorial(1); assertEquals(1, math.getCalls()); math.factorial(1); assertEquals(2, math.getCalls()); ) @Test public void factorial() ( assertTrue(math.factorial(0) == 1); assertTrue(math.factorial(1) == 1); assertTrue(math.factorial(5) == 120); ) @Test(expected = IllegalArgumentException.class) public void factorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() ( assertTrue(math.plus(1, 1) == 3); ) )

روش فراخوانی اعتبار شمارنده تماس را آزمایش می کند. روش فاکتوریل بررسی می کند که آیا فاکتوریل برای برخی از مقادیر استاندارد به درستی محاسبه شده است یا خیر. روش factorialNegative بررسی می کند که یک IllegalArgumentException برای مقادیر فاکتوریل منفی پرتاب شود. روش todo نادیده گرفته خواهد شد. سعی کنید هنگام آزمایش کد، حاشیه نویسی @Ignore را حذف کنید.

متد assertTrue بررسی می کند که آیا نتیجه یک عبارت درست است یا خیر. چند روش دیگر که ممکن است مفید باشند:

  • assertEquals - نتیجه مورد انتظار و نتیجه دریافتی مطابقت دارند.
  • assertNull - نتیجه عبارت null است.
  • assertNotNull - نتیجه عبارت با null متفاوت است.
  • assertSame - اشیاء مورد انتظار و دریافت شده یک شی هستند.
  • fail - متد یک استثنا AssertionError ایجاد می کند - ما آن را در جایی اضافه می کنیم که اجرای برنامه نباید انجام شود.

در ما دنیای مدرن IDE ها می توانند آزمایش ها را در یک پروژه پیدا کرده و به سادگی اجرا کنند. اما اگر بخواهید آنها را به صورت دستی با استفاده از کد برنامه اجرا کنید چه می شود. برای این کار می توانید از Runner استفاده کنید.نسخه های متنی - junit.textui.TestRunner، نسخه های گرافیکی - junit.swingui.TestRunner، junit.awtui.TestRunner وجود دارد.

اما کمی بیشتر روش مدرناستفاده از کلاس JUnitCore است. متد اصلی زیر را به کلاس MathFuncTest اضافه کنید:

عمومی void main(string args) Exception (JUnitCore runner = new JUnitCore(); Result result = runner.run(MathFuncTest.class)؛ System.out.println("run tests: " + result.getRunCount()); System.out.println("تست های ناموفق: " + result.getFailureCount()); System.out.println("تست های نادیده گرفته شده: " + result.getIgnoreCount()); System.out.println ("موفقیت: " + نتیجه .موفقیت آمیز بود())؛ )

و نتیجه اجرا:

اجرای تست: 3 تست ناموفق: 0 تست نادیده گرفته شده: 1 موفقیت: درست

در بیشتر نسخه های قبلیبرای نوشتن یک کلاس تست JUnit، لازم بود که یک نسل از junit.framework.TestCase ایجاد شود. سپس لازم بود سازنده ای تعریف شود که یک String را به عنوان پارامتر می گیرد - نام متد - و آن را به کلاس والد ارسال می کند. هر روش آزمون باید با آزمون پیشوند شروع می شد. برای مقداردهی اولیه و انتشار منابع از روش setUp و tearDown استفاده شد. خلاصه وحشت. خوب، حالا همه چیز ساده است، بله.

برای امروز کافی است. من مطمئن هستم که JUnit Framework به شما کمک زیادی خواهد کرد. نظرات و سوالات در مورد مقاله استقبال می شود.




بالا