Bài kiểm tra Java dành cho sinh viên. Bài kiểm tra dành cho lập trình viên Java, hay Tôi có quá khắt khe với ứng viên không? Các loại thử nghiệm và vị trí thử nghiệm JUnit trong phân loại

Java là ngôn ngữ lập trình hướng đối tượng, có kiểu gõ mạnh được phát triển bởi Sun Microsystems vào năm 1991. Ngôn ngữ này ban đầu được gọi là Oak và được dùng để lập trình các thiết bị điện tử tiêu dùng, nhưng sau đó được đổi tên thành Java. Việc phát hành chính thức Java vào năm 1995 đã rất thành công và ngay sau đó, ngôn ngữ Java đã có được vị trí vững chắc như một công cụ để phát triển các ứng dụng máy chủ.

Ngày nay, Java được sử dụng trong mọi lĩnh vực phát triển phần mềm - ứng dụng máy chủ, ứng dụng máy tính để bàn, công cụ, ứng dụng web - tất cả đều được phát triển bằng Java và các công nghệ liên quan.

Đối tượng mục tiêu của thử nghiệm Java

Bài kiểm tra Java bao gồm các câu hỏi mà hầu hết các nhà phát triển có kinh nghiệm lập trình Java tối thiểu sẽ biết câu trả lời. Bài kiểm tra sẽ hữu ích với nhiều người, kể cả những người không có nhiều kinh nghiệm với Java và muốn hiểu biết tối thiểu về các khái niệm cơ bản của ngôn ngữ lập trình phổ biến này. Bài kiểm tra này cũng có thể hữu ích cho những sinh viên học Java để củng cố kiến ​​thức thu được ở trường đại học hoặc là kết quả của quá trình làm việc độc lập.

Điều kiện tiên quyết của thử nghiệm Java

Giả định rằng trước khi làm bài kiểm tra Java Căn bản, bạn đã biết các khái niệm cơ bản như “biến”, “vòng lặp”, “phương thức” và biết cú pháp của các cấu trúc ngôn ngữ cơ bản. Nếu trường hợp này không xảy ra, chúng tôi khuyên bạn trước tiên nên tự làm quen với kiến ​​thức cơ bản về Java bằng cách đọc khóa học giới thiệu.

Cấu trúc thử nghiệm Java

Bài kiểm tra "Java - Nguyên tắc cơ bản" bao gồm các chủ đề sau:

Bạn có thể đọc thêm về chủ đề của các câu hỏi kiểm tra dưới đây:

  • Đối tượng và lớp: các câu hỏi trong chủ đề này bao gồm các khái niệm như lớp, phiên bản của lớp (đối tượng), hàm tạo, phương thức và trường lớp.
  • Cú pháp: Các câu hỏi trong phần này sẽ kiểm tra kiến ​​thức của bạn về từ khóa ngôn ngữ, toán tử, các kiểu cơ bản (nguyên thủy, Chuỗi), cấu trúc điều khiển (if-else, while, for) và hiểu biết về xử lý ngoại lệ (Ngoại lệ).
  • Khác: Phần này chứa các câu hỏi liên quan đến các khái niệm, thuật ngữ và chữ viết tắt cơ bản, quy ước đặt tên cho các lớp, biến và phương thức. Phần này cũng bao gồm các câu hỏi về các tệp (.java, .class, .jar) và các gói, vòng đời của các đối tượng và việc thu gom rác.

Làm bài kiểm tra Java trực tuyến giúp bạn kiểm tra và củng cố kiến ​​thức về các nguyên tắc cơ bản của Java, đồng thời dẫn bạn đến các bài kiểm tra nâng cao hơn từ phần kiểm tra Java.

Chúng tôi hy vọng rằng bạn thấy bài kiểm tra này hữu ích và thú vị.

Phát triển hơn nữa của thử nghiệm Java

Bài kiểm tra Java được cập nhật liên tục với các câu hỏi mới.

Kế hoạch trước mắt của nhóm Quizful bao gồm việc tạo các bài kiểm tra cấp chuyên gia bằng Java. Có lẽ một bài kiểm tra Java Puzzlers sẽ được tạo ra, nhưng thật không may, nó chứa rất nhiều câu hỏi.

Nếu bạn có bất kỳ nhận xét nào về các câu hỏi kiểm tra, hãy nhớ viết thư cho chúng tôi. Chúc may mắn.

JUnit- thư viện để thử nghiệm đơn vị các chương trình Java. Được tạo bởi Kent Beck và Eric Gamma, JUnit thuộc nhóm xUnit gồm các khung dành cho các ngôn ngữ lập trình khác nhau, có nguồn gốc từ SUnit dành cho Smalltalk của Kent Beck. JUnit đã tạo ra một hệ sinh thái gồm các tiện ích mở rộng - JMock, EasyMock, DbUnit, HttpUnit, v.v.

Thư viện JUnitđã được chuyển sang các ngôn ngữ khác, bao gồm PHP (PHPUnit), C# (NUnit), Python (PyUnit), Fortran (fUnit), Delphi (DUnit), Free Pascal (FPCUnit), Perl (Test::Unit), C++ (CPPUnit ), Flex (FlexUnit), JavaScript (JSUnit).

JUnit là một khung Java để thử nghiệm, tức là thử nghiệm các phần mã riêng lẻ, ví dụ: các phương thức hoặc lớp. Kinh nghiệm thu được khi làm việc với JUnit rất quan trọng trong việc phát triển các khái niệm kiểm thử phần mềm.

Kiểm tra ví dụ JUnit

Nhập org.junit.Test; nhập junit.framework.Assert; lớp công khai MathTest ( @Test public void testEquals() ( Assert.assertEquals(4, 2 + 2); Assert.assertTrue(4 == 2 + 2); ) @Test public void testNotEquals() ( Assert.assertFalse(5 = = 2 + 2);

Sự cần thiết phải sử dụng JUnit

JUnit cho phép bạn nhanh chóng xác minh rằng mã của bạn đang hoạt động bất kỳ lúc nào. Nếu chương trình không hoàn toàn đơn giản và bao gồm nhiều lớp và phương thức thì việc kiểm thử chương trình có thể mất nhiều thời gian. Đương nhiên, tốt hơn là tự động hóa quá trình này. Cách sử dụng JUnit cho phép bạn kiểm tra mã chương trình mà không cần nỗ lực nhiều và không mất nhiều thời gian.

Kiểm tra đơn vị các lớp và hàm là một loại tài liệu về những gì được mong đợi khi thực hiện chúng. Và không chỉ tài liệu, mà cả tài liệu có thể tự động kiểm tra mã xem có tuân thủ các chức năng được cung cấp hay không. Điều này thuận tiện và thường các bài kiểm tra được phát triển cùng nhau và trước khi các lớp được triển khai. Phát triển dựa trên thử nghiệm là một công nghệ cực kỳ phổ biến để tạo ra phần mềm nghiêm túc.

Các loại thử nghiệm và vị trí thử nghiệm JUnit trong phân loại

Kiểm thử phần mềm có thể được chia thành hai loại:

  • kiểm tra hộp đen;
  • kiểm thử hộp trắng.

Khi kiểm thử một chương trình dưới dạng hộp đen, cấu trúc bên trong của ứng dụng không được tính đến. Tất cả những gì quan trọng là chức năng mà ứng dụng phải cung cấp. Khi kiểm thử một chương trình dưới dạng hộp trắng, cấu trúc bên trong sẽ được tính đến, tức là. lớp và phương thức. Ngoài ra, thử nghiệm có thể được chia thành bốn cấp độ:

  • kiểm tra đơn vị - kiểm tra từng phần mã riêng lẻ;
  • thử nghiệm tích hợp - thử nghiệm sự tương tác và cộng tác của các thành phần;
  • kiểm tra hệ thống - kiểm tra toàn bộ hệ thống;
  • thử nghiệm chấp nhận - thử nghiệm cuối cùng của hệ thống đã hoàn thiện để tuân thủ các yêu cầu.

Kiểm thử đơn vị theo định nghĩa là kiểm thử hộp trắng.

Thử nghiệm đơn vị được sử dụng trong hai phiên bản - JUnit 3 và JUnit 4. Hãy xem xét cả hai phiên bản, vì các dự án cũ hơn vẫn sử dụng phiên bản 3, hỗ trợ Java 1.4.

JUnit 3

Để tạo thử nghiệm, bạn nên kế thừa lớp thử nghiệm TestCase, ghi đè các phương thức setUp và TearsDown nếu cần và quan trọng nhất là phát triển các phương thức thử nghiệm có tên phải bắt đầu bằng chữ viết tắt “test”. Khi chạy thử nghiệm, một phiên bản của lớp thử nghiệm sẽ được tạo trước tiên (đối với mỗi thử nghiệm trong lớp là một phiên bản riêng của lớp), sau đó phương thức setUp được thực thi, bản thân thử nghiệm được khởi chạy và cuối cùng là phương thức TearsDown được thực thi. Nếu bất kỳ phương pháp nào đưa ra ngoại lệ, thử nghiệm sẽ thất bại.

Lưu ý: phương pháp thử nghiệm phải là public void nhưng có thể ở dạng tĩnh.

Các thử nghiệm bao gồm việc thực thi một số mã và kiểm tra. Việc kiểm tra thường được thực hiện bằng cách sử dụng một lớp Khẳng định mặc dù đôi khi từ khóa khẳng định được sử dụng.

Ví dụ: hãy xem xét một tiện ích chuỗi bao gồm các phương thức kiểm tra chuỗi trống và biểu thị chuỗi byte dưới dạng chuỗi thập lục phân:

Lớp công khai JUnit3StringUtilsTest mở rộng TestCase ( Private Final Map toHexStringData = new HashMap(); protected void setUp() ném Ngoại lệ ( toHexStringData.put("", byte mới); toHexStringData.put("01020d112d7f", byte mới(1,2, 13,17,45,127)); toHexStringData.put("00fff21180", byte mới(0,-1,-14,17,-128 )); //... ) protected void TearsDown() ném Ngoại lệ ( toHexStringData. clear(); ) public void testToHexString() ( for (Iterator iterator = toHexStringData.keySet().iterator(); iterator.hasNext();) ( Chuỗi cuối cùng được mong đợi = (String)iterator.next(); byte cuối cùng testData = (byte)toHexStringData.get(dự kiến); Chuỗi cuối cùng thực tế = StringUtils.toHexString(testEquals(dự kiến, thực tế) ) //... )

Các tính năng bổ sung, TestSuite

JUnit 3 có một số tính năng bổ sung. Ví dụ: bạn có thể nhóm các bài kiểm tra. Để làm điều này bạn cần sử dụng lớp TestSuite:

Lớp công khai JUnit3StringUtilsTestSuite mở rộng TestSuite ( public JUnit3StringUtilsTestSuite() ( addTestSuite(StringUtilsJUnit3Test.class); addTestSuite(OtherTest1.class); addTestSuite(OtherTest2.class); ) )

Bạn có thể lặp lại bài kiểm tra nhiều lần. RepeatedTest được sử dụng cho việc này:

Lớp công khai JUnit3StringUtilsRepeatedTest mở rộng RepeatedTest ( public JUnit3StringUtilsRepeatedTest() ( super(new JUnit3StringUtilsTest(), 100); ) )

Bằng cách kế thừa lớp kiểm tra từ ExceptionTestCase, bạn có thể kiểm tra mã để đưa ra một ngoại lệ:

Lớp công khai JUnit3StringUtilsExceptionTest mở rộng ExceptionTestCase ( public JUnit3StringUtilsExceptionTest(final String name) ( super(name, NullPointerException.class); ) public void testToHexString() ( StringUtils.toHexString(null); ) )

Như bạn có thể thấy từ các ví dụ, mọi thứ khá đơn giản và không có gì thừa - mức tối thiểu là mã để kiểm tra JUnit.

JUnit 4

JUnit 4 bổ sung hỗ trợ cho các tính năng mới từ Java 5.0; các bài kiểm tra có thể được khai báo bằng cách sử dụng chú thích. Đồng thời, có khả năng tương thích ngược với phiên bản trước của khung. Hầu như tất cả các ví dụ được thảo luận ở trên sẽ hoạt động trong JUnit 4 ngoại trừ RepeatedTest, tính năng này bị thiếu trong phiên bản mới.

Những thay đổi nào đã được thực hiện trong JUnit 4? Hãy xem cùng một ví dụ nhưng sử dụng các tính năng mới:

Lớp công khai JUnit4StringUtilsTest mở rộng Assert (Bản đồ cuối cùng riêng tư toHexStringData = HashMap mới (); @Before public static void setUpToHexStringData() ( toHexStringData.put("", byte mới); toHexStringData.put("01020d112d7f", byte mới(1,2,13,17,45,127)); toHexStringData.put("00fff21180" , byte mới(0,-1,-14,17,-128)); //... ) @After public static void TearsDownToHexStringData() ( toHexStringData.clear(); ) @Test public void testToHexString() ( for (Bản đồ.Entry entry: toHexStringData.entrySet()) ( byte cuối cùng testData = entry.getValue(); Chuỗi cuối cùng được mong đợi = entry.getKey(); Chuỗi cuối cùng thực tế = StringUtils.toHexString(testData); khẳng địnhEquals(mong đợi, thực tế); ) ) )

Điều gì đã thay đổi trong JUnit 4?

  • Để đơn giản hóa công việc, bạn có thể kế thừa từ lớp Khẳng định, mặc dù điều này là không cần thiết.
  • chú thích @Trước biểu thị các phương thức sẽ được gọi trước khi thực hiện kiểm tra. Các phương pháp phải được khoảng trống công khai. Các cài đặt trước cho thử nghiệm thường được đặt ở đây, trong trường hợp của chúng tôi đây là việc tạo dữ liệu thử nghiệm (phương pháp setUpToHexStringData).
  • Có thể sử dụng chú thích @BeforeClass, biểu thị các phương thức sẽ được gọi trước khi phiên bản lớp kiểm tra được tạo; các phương pháp nên khoảng trống tĩnh công cộng. Chú thích (phương pháp) này rất hợp lý khi sử dụng để kiểm tra trong trường hợp lớp chứa một số bài kiểm tra sử dụng các giá trị đặt trước khác nhau hoặc khi một số bài kiểm tra sử dụng cùng một dữ liệu để không lãng phí thời gian tạo chúng cho mỗi bài kiểm tra.
  • chú thích @Sau đó biểu thị các phương thức sẽ được gọi sau khi thực hiện kiểm tra. Các phương pháp phải được khoảng trống công khai. Đây là nơi diễn ra các hoạt động giải phóng tài nguyên sau khi kiểm tra; trong trường hợp của chúng tôi, làm sạch dữ liệu thử nghiệm (phương pháp giọt nước mắtDownToHexStringData).
  • chú thích @Sau giờ học có liên quan về ý nghĩa với @BeforeClass, nhưng thực thi các phương thức sau khi kiểm tra lớp. Như trường hợp với @BeforeClass, các phương pháp nên được khoảng trống tĩnh công cộng.
  • chú thích @Bài kiểm tra là viết tắt của phương pháp thử nghiệm. Như trước đây, những phương pháp này nên được khoảng trống công khai. Bản thân việc kiểm tra được đặt ở đây. Ngoài ra, trong chú thích này, bạn có thể sử dụng hai tham số: dự kiến ​​- đặt ngoại lệ dự kiến ​​và thời gian chờ - đặt thời gian mà sau đó thử nghiệm được coi là không thành công.

Ví dụ về sử dụng chú thích với tham số, JUnit Test:

@Test(expected = NullPointerException.class) public void testToHexStringWrong() ( StringUtils.toHexString(null); ) @Test(timeout = 1000) public void infinity() ( while (true); )

Bỏ qua việc thực hiện kiểm thử, JUnit Bỏ qua

Ví dụ: nếu một trong các bài kiểm tra cần phải bị vô hiệu hóa vì một số lý do nghiêm trọng, thì bài kiểm tra sẽ liên tục thất bại. Việc sửa lỗi kiểm tra có thể được hoãn lại cho đến một tương lai tươi sáng hơn bằng cách chú thích @Phớt lờ. Nếu bạn đặt chú thích này vào một lớp thì tất cả các bài kiểm tra trong lớp đó sẽ bị vô hiệu hóa.

@Bỏ qua @Test(timeout = 1000) public void infinity() ( while (true); )

Quy tắc kiểm tra, Quy tắc JUnit

JUnit cho phép bạn sử dụng các quy tắc do nhà phát triển xác định trước và sau khi thực hiện thử nghiệm, giúp mở rộng chức năng. Ví dụ: có các quy tắc tích hợp để đặt thời gian chờ cho bài kiểm tra (Timeout), để đặt các ngoại lệ dự kiến ​​(ExpectedException), để làm việc với các tệp tạm thời (TemporaryFolder), v.v.

Để khai báo một quy tắc bạn cần tạo công cộng Không tĩnh một trường loại có nguồn gốc từ MethodRule và chú thích nó bằng một từ khóa Luật lệ.

Lớp công khai JUnitOtherTest ( @Rule public Final Thư mục TemporaryFolder = new TemporaryFolder(); @Rule public Final Hết thời gian chờ = new Timeout(1000); @Rule public Final ExpectedException được ném = ExpectedException.none(); @Ignore @Test public void anotherInfinity( ) ( while (true); ) @Test public void testFileWriting() ném IOException ( Final File log = folder.newFile("debug.log"); Final FileWriter logWriter = new FileWriter(log); logWriter.append("Xin chào, "); logWriter.append("World!!!"); logWriter.flush(); logWriter.close(); ) @Test public void testExpectedException() ném IOException ( Throw.expect(NullPointerException.class); StringUtils.toHexString (vô giá trị) )

Test Suites, JUnit Suite, SuiteClasses

Chạy thử nghiệm có thể được cấu hình bằng cách sử dụng chú thích @RunWith. Các lớp kiểm thử chứa các phương thức kiểm thử có thể được kết hợp thành các bộ kiểm thử (Suite). Ví dụ: hai lớp kiểm tra đối tượng đã được tạo: TestFilter, TestConnect. Hai lớp kiểm tra này có thể được kết hợp thành một lớp kiểm tra TestWidgets.java:

Gói com.objects; nhập org.junit.runner.RunWith; nhập org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses (( TestFilter.class, TestConnect.class )) lớp công khai TestWidgets ()

Để định cấu hình các bài kiểm tra sẽ chạy, chú thích @SuiteClasses sẽ được sử dụng, bao gồm các lớp kiểm tra.

Danh mục trừu tượng

chú thích Thể loại cho phép bạn kết hợp các bài kiểm tra thành các danh mục (nhóm). Với mục đích này, bài kiểm tra xác định một danh mục @Loại, sau đó các danh mục thử nghiệm sẽ chạy trong Suite được định cấu hình. Nó có thể trông như thế này:

Lớp công khai JUnitStringUtilsCategoriesTest mở rộng Assert ( //... @Category (Unit.class) @Test public void testIsEmpty() ( //... ) //... ) @RunWith (Categories.class) @Categories.IncludeCategory ( Unit.class) @Suite.SuiteClasses (( JUnitOtherTest.class, JUnitStringUtilsCategoriesTest.class )) lớp công khai JUnitTestSuite()

Tóm tắt, JUnit được tham số hóa

chú thích Tham số hóa cho phép sử dụng các thử nghiệm tham số hóa. Để thực hiện điều này, một phương thức tĩnh được khai báo trong lớp thử nghiệm, trả về danh sách dữ liệu sẽ được sử dụng làm đối số cho hàm tạo của lớp.

@RunWith (Parameterized.class) lớp công khai JUnitStringUtilsParameterizedTest mở rộng Assert ( charSequence testData cuối cùng riêng tư; dự kiến ​​boolean cuối cùng riêng tư; public JUnitStringUtilsParameterizedTest(final CharSequence testData, boolean cuối cùng dự kiến) ( this.testData = testData; this.expected = dự kiến; ) @Test public void testIsEmpty () ( cuối cùng boolean thực tế = StringUtils.isEmpty (testData); khẳng địnhEquals(dự kiến, thực tế); ) @Parameterized.Parameters Danh sách tĩnh công khai isEmptyData() ( return Arrays.asList(new Object ( ( null, true ), ("", true ), ( " ", false ), ("some string", false ), )); ) )

Tham số hóa phương thức: Theories.class, DataPoints, DataPoint, Theory

chú thích Lý thuyết tham số hóa phương thức thử nghiệm, không phải hàm tạo. Dữ liệu được đánh dấu bằng @Điểm dữ liệu@Điểm dữ liệu, phương pháp thử - sử dụng @Lý thuyết. Một thử nghiệm sử dụng chức năng này có thể trông giống như thế này:

@RunWith(Theories.class) public class JUnitStringUtilsTheoryTest mở rộng Assert ( @DataPoints public static Object isEmptyData = new Object ( ( "", true ), ( " ", false ), ("some string", false ), ); @DataPoint public static Object nullData = new Object ( null, true ); @Theory public void testEmpty(final Object... testData) ( Final boolean thực tế = StringUtils.isEmpty ((CharSequence) testData); khẳng địnhEquals(testData, thực tế); ) )

Trình tự thực hiện kiểm tra

Nếu cần chạy thử nghiệm theo một thứ tự cụ thể, bạn có thể sử dụng chú thích @FixMethodOrder(MethodSorters.NAME_ASCENDING) được xác định trong JUnit 4.11. Ví dụ:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) lớp công khai MyTest ( @Test public void test01())(...) @Test public void test02())(...) ... @Test public void test09())(. ..) )

Nếu không, bạn có thể sử dụng 2 cách tiếp cận sau.

Kiểm tra trống01(); void test02(); ... void test09(); @Test public void testOrder1() ( test1(); test3(); ) @Test(expected = Exception.class) public void testOrder2() ( test2(); test3(); test1(); ) @Test(expected = NullPointerException.class) public void testOrder3() ( test3(); test1(); test2(); )

@Test public void testAllOrders() ( for (Mẫu đối tượng: permute(1, 2, 3)) ( for (Chỉ mục đối tượng: sample) ( switch (((Integer) index).intValue()) ( trường hợp 1: test1( ); trường hợp 2: test2();

Danh sách chú thích chính

chú thíchSự miêu tả
@Bài kiểm tra
phương pháp kiểm tra void công khai()
phương pháp này là thử nghiệm
@Test(thời gian chờ=100)
phương pháp kiểm tra void công khai()
nếu thời gian thực hiện vượt quá tham số timeout, thử nghiệm sẽ thất bại
@Test (dự kiến ​​= MyException.class)
phương pháp kiểm tra void công khai()
phương thức phải đưa ra một ngoại lệ thuộc lớp MyException, nếu không thử nghiệm sẽ thất bại
@Phớt lờ
phương pháp kiểm tra void công khai()
bỏ qua phương pháp kiểm tra
@BeforeClass
một phương thức được gọi một lần cho một lớp trước khi thực hiện các phương thức thử nghiệm; ở đây bạn có thể đặt một khởi tạo chỉ cần thực hiện một lần, ví dụ: đọc dữ liệu sẽ được sử dụng trong các phương pháp thử nghiệm hoặc tạo kết nối tới cơ sở dữ liệu
@Sau giờ học
phương pháp kiểm tra khoảng trống tĩnh công khai()
một phương thức được gọi một lần cho một lớp sau khi thực hiện các phương thức thử nghiệm; ở đây bạn có thể thực hiện việc khởi tạo lại chỉ cần thực hiện một lần, chẳng hạn như đóng kết nối tới cơ sở dữ liệu hoặc xóa dữ liệu không còn cần thiết
@Trước
khoảng trống tĩnh công khai beforeMethod()
một phương thức được gọi trước mỗi phương thức kiểm tra trong lớp kiểm tra; ở đây bạn có thể thực hiện việc khởi tạo cần thiết, ví dụ: đặt các tham số ban đầu
@Sau đó
khoảng trống tĩnh công khai afterMethod()
một phương thức được gọi sau mỗi phương thức kiểm tra trong lớp kiểm tra; tại đây bạn có thể thực hiện việc khởi tạo lại cần thiết, ví dụ: xóa dữ liệu không còn cần thiết

Danh sách các loại kiểm tra Xác nhận

Loại kiểm traSự miêu tả
thất bại()
thất bại (Thông báo chuỗi)
hủy bỏ bài kiểm tra do có lỗi, tức là bài kiểm tra sẽ thất bại
khẳng định đúng(điều kiện boolean)
khẳng địnhTrue(thông báo java.lang.String, điều kiện boolean)
kiểm tra xem điều kiện có bằng true không
khẳng địnhFalse(điều kiện boolean)
khẳng địnhFalse(Thông báo chuỗi, điều kiện boolean)
kiểm tra xem điều kiện có bằng sai không
khẳng địnhEquals(<тип>hy vọng<тип>thật sự)
khẳng địnhEquals(Thông báo chuỗi,<тип>hy vọng<тип>thật sự)
kiểm tra sự bình đẳng;<тип>- đây là Object, int, double, v.v.
khẳng địnhArrayEquals(byte dự kiến, byte thực tế)
khẳng địnhArrayEquals(Thông báo chuỗi,<тип>mong đợi<тип>thực tế)
kiểm tra sự bằng nhau của mảng; tương tự như khẳng địnhEquals;<тип>- đây là Object, int, double, v.v.
khẳng địnhNotNull(Đối tượng đối tượng)
khẳng địnhNotNull(Thông báo chuỗi, đối tượng đối tượng)
kiểm tra xem Object có phải là null không
khẳng địnhNull(Đối tượng đối tượng)
khẳng địnhNull(Thông báo chuỗi, đối tượng đối tượng)
kiểm tra xem Object có rỗng không
khẳng địnhSame(Đối tượng mong đợi, Đối tượng thực tế)
khẳng địnhSame(Thông báo chuỗi, Đối tượng mong đợi, Đối tượng thực tế)
kiểm tra sự bằng nhau của hai đối tượng được mong đợi và thực tế, tức là cùng một đối tượng

Ví dụ thử nghiệm JUnit

Để chứng minh các khả năng chính của JUnit, chúng tôi sử dụng lớp java nguyên thủy FuncMath, có hai phương thức - tìm giai thừa của một số không âm và tổng của hai số. Ngoài ra, thể hiện của lớp sẽ chứa bộ đếm cuộc gọi phương thức.

Lớp công khai FuncMath ( int calls; public int getCalls() ( return calls; ) public long giai thừa(int number) ( calls++; if (number< 0) throw new IllegalArgumentException(); long result = 1; if (number >1) ( for (int i = 1; i< = number; i++) result = result * i; } return result; } public long plus(int num1, int num2) { calls++; return num1 + num2; } }

Đôi khi mỗi trường hợp kiểm thử cần một số ngữ cảnh để chạy, chẳng hạn như các thể hiện của lớp được tạo trước. Và sau khi thực hiện, bạn cần giải phóng các tài nguyên dành riêng. Trong trường hợp này, chú thích @Before và @After được sử dụng. Phương thức được đánh dấu @Before sẽ được thực thi trước mỗi trường hợp kiểm thử và phương thức được đánh dấu @After sẽ được thực thi sau mỗi trường hợp kiểm thử. Nếu việc khởi tạo và giải phóng tài nguyên chỉ cần được thực hiện một lần - tương ứng, trước và sau tất cả các lần kiểm tra - thì hãy sử dụng cặp chú thích @BeforeClass và @AfterClass.

Một lớp thử nghiệm với một số tình huống sẽ trông như thế này:

Nhập org.junit.Test; nhập org.junit.After; nhập org.junit.Before; nhập org.junit.Assert; nhập org.junit.AfterClass; nhập org.junit.BeforeClass; public class JUnit_funcMath mở rộng Assert ( Private FuncMath math; @Before public void init() ( math = new FuncMath(); ) @After public void TearsDown() ( math = null; ) @Test public void calls() ( khẳng địnhEquals(" math.getCalls() != 0", 0, dao.getConnection()); math.factorial(1); khẳng địnhEquals(1, math.getCalls()); math.factorial(1); khẳng địnhEquals(2, math. getCalls()); ) @Test public void giai thừa() ( khẳng địnhTrue(math.factorial(0) == 1); khẳng địnhTrue(math.factorial(1) == 1); khẳng địnhTrue(math.factorial(5) == 120); ) @Test(expected = IllegalArgumentException.class) public void FactorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() ( khẳng địnhTrue(math.plus(1, 1) == 3); ) )

Phương thức cuộc gọi kiểm tra tính hợp lệ của bộ đếm cuộc gọi. Phương pháp giai thừa kiểm tra xem giai thừa có được tính toán chính xác đối với một số giá trị tiêu chuẩn hay không. Phương thức FactorialNegative kiểm tra xem IllegalArgumentException có bị ném ra đối với các giá trị giai thừa âm hay không. Phương thức việc cần làm sẽ bị bỏ qua.

Tóm lại, cần lưu ý rằng không phải tất cả các khả năng sử dụng JUnit đều được trình bày trong bài viết. Nhưng như bạn có thể thấy từ các ví dụ đã cho, khung này khá dễ sử dụng, có ít tính năng bổ sung nhưng có thể mở rộng bằng cách sử dụng các quy tắc và trình khởi chạy.

Trong khi tìm kiếm các tác vụ kiểm tra dành cho lập trình viên Java, tôi tình cờ thấy một trang web thú vị (người dùng Avast không nên truy cập, đã phát hiện thấy một tập lệnh Trojan, những trang khác có vẻ ổn) - http://www.betterprogrammer.com. Nó kiểm tra trình độ của các lập trình viên Java theo cách đơn giản nhưng tự động nhất: đề nghị viết một số hàm (phương thức) với độ phức tạp tăng dần và sao chép mã vào TextArea. Tiếp theo, công cụ trang web thực hiện điều gì đó với các nhiệm vụ (không ít hơn một bài kiểm tra đơn vị), tính toán một chỉ số chất lượng nhất định dựa trên tiêu chí “tốc độ-chất lượng” và cho điểm cuối cùng theo dạng sau:

Sau đó các câu hỏi bắt đầu. Bản thân tôi đã lập trình Java lần thứ hai trong đời (và do đó đơn giản là bỏ qua các tác vụ phức tạp), vì vậy 82% trong bài kiểm tra này tương ứng với trình độ lập trình viên không phải java. Vậy thì Java Junior, Lập trình viên Java và thậm chí là Java Senior nên tuyển dụng bao nhiêu?! Bạn có thể mong đợi kết quả gì từ hiện tại lập trình viên java - 90, 95, 99? Và cuối cùng, điều gì sẽ xảy ra nếu “lập trình viên” đạt điểm dưới 82 nhưng vẫn nộp đơn xin một loại công việc nào đó?!

Việc kiểm tra không phải lúc nào cũng vui vẻ và thú vị. Quá trình này thường khá dài và đôi khi có nhiều công việc đơn điệu. Có vẻ như gần đây các lập trình viên đã sử dụng đầu ra tiêu chuẩn hoặc trình gỡ lỗi để kiểm tra các lớp java.

Trong bài viết này, tôi sẽ mô tả thư viện JUnit 4, giúp đơn giản hóa và tự động hóa đáng kể quá trình viết bài kiểm tra.

Để chứng minh các khả năng chính của JUnit Framework, hãy viết một lớp nguyên thủy trong Java và mô phỏng nó. Lớp này sẽ có hai phương thức - tìm giai thừa của một số không âm và tổng của hai số. Ngoài ra, thể hiện của lớp sẽ chứa bộ đếm cuộc gọi phương thức.

Lớp công khai MathFunc ( int calls; public int getCalls() ( return calls; ) public long giai thừa(int number) ( calls++; if (number 1) ( for (int i = 1; i

Bây giờ hãy viết bài kiểm tra Đơn vị. Để làm điều này, chúng ta sẽ tạo một lớp với một số phương thức thử nghiệm. Đương nhiên, một lớp cũng có thể chứa các phương thức phụ trợ thông thường. Để người chạy thử xác định được ai là ai, các phương thức thử nghiệm phải được chú thích bằng @Test.

Một chú thích có thể có các tham số sau:

  • dự kiến ​​- cho biết ngoại lệ nào sẽ được phương thức tạo ra (xem ví dụ bên dưới);
  • hết thời gian chờ - sau bao lâu tính bằng mili giây, bài kiểm tra sẽ ngừng chạy và được tính là không thành công.

Nếu bạn muốn cho biết nên bỏ qua một bài kiểm tra nào đó, hãy đánh dấu bài kiểm tra đó bằng chú thích @Ignore. Mặc dù bạn có thể chỉ cần xóa chú thích @Test.

Có thể đôi khi bạn cần một số ngữ cảnh, chẳng hạn như các thể hiện của lớp được tạo trước, để chạy từng trường hợp kiểm thử. Và sau khi thực hiện, bạn cần giải phóng các tài nguyên dành riêng. Trong trường hợp này, bạn sẽ cần chú thích @Before và @After. Phương thức được đánh dấu @Before sẽ được thực thi trước mỗi trường hợp kiểm thử và phương thức được đánh dấu @After sẽ được thực thi sau mỗi trường hợp kiểm thử.

Nếu việc khởi tạo và giải phóng tài nguyên chỉ cần được thực hiện một lần - tương ứng, trước và sau tất cả các lần kiểm tra - thì hãy sử dụng cặp chú thích @BeforeClass và @AfterClass.

Và đây là lớp thử nghiệm với một số tập lệnh thử nghiệm:

Lớp công khai MathFuncTest ( Private MathFunc math; @Before public void init() ( math = new MathFunc(); ) @After public void TearsDown() ( math = null; ) @Test public void calls() ( khẳng địnhEquals(0, math .getCalls()); math.factorial(1); khẳng địnhEquals(1, math.getCalls()); khẳng địnhEquals(2, math.getCalls()); (math.factorial(1) == 1); khẳng địnhTrue(math.factorial(5) == 120); ) @Test(expected = IllegalArgumentException.class) public void giai thừaNegative() ( math.factorial(-1); ) @Bỏ qua @Test public void todo() ( khẳng địnhTrue(math.plus(1, 1) == 3); ) )

Phương thức cuộc gọi kiểm tra tính hợp lệ của bộ đếm cuộc gọi. Phương pháp giai thừa kiểm tra xem giai thừa có được tính toán chính xác đối với một số giá trị tiêu chuẩn hay không. Phương thức FactorialNegative kiểm tra xem IllegalArgumentException có bị ném ra đối với các giá trị giai thừa âm hay không. Phương thức việc cần làm sẽ bị bỏ qua. Hãy thử xóa chú thích @Ignore khi bạn thử nghiệm mã.

Phương thức khẳng địnhTrue kiểm tra xem kết quả của một biểu thức có đúng hay không. Một số phương pháp khác có thể có ích:

  • khẳng địnhEquals - kết quả mong đợi và kết quả nhận được phù hợp;
  • khẳng địnhNull - kết quả của biểu thức là null;
  • khẳng địnhNotNull - kết quả của biểu thức khác với null;
  • khẳng địnhSame - các đối tượng mong đợi và nhận được là cùng một đối tượng.
  • thất bại - phương thức tạo ra một ngoại lệ AssertionError - chúng tôi thêm nó vào nơi không nên thực hiện chương trình.

Trong thế giới hiện đại của chúng ta, IDE có thể tìm và chạy thử nghiệm trong một dự án một cách đơn giản. Nhưng nếu bạn muốn chạy chúng theo cách thủ công bằng mã chương trình thì sao. Để làm điều này, bạn có thể sử dụng Runner. Có các phiên bản văn bản - junit.textui.TestRunner, phiên bản đồ họa - junit.swingui.TestRunner, junit.awtui.TestRunner.

Nhưng một phương pháp hiện đại hơn một chút là sử dụng lớp JUnitCore. Thêm phương thức chính sau vào lớp MathFuncTest:

Public static void main(String args) ném Ngoại lệ ( JUnitCore Runner = new JUnitCore(); Kết quả kết quả = Runner.run(MathFuncTest.class); System.out.println("chạy thử nghiệm: " + result.getRunCount()); System.out.println("kiểm tra thất bại: " + result.getFailureCount()); System.out.println("bỏ qua kiểm tra: " + result.getIgnoreCount()); System.out.println("thành công: " + result .đã thành công());

Và kết quả thực hiện:

Chạy thử nghiệm: 3 thử nghiệm thất bại: 0 thử nghiệm bị bỏ qua: 1 thành công: đúng

Trong các phiên bản trước của JUnit, để viết một lớp kiểm tra, bạn phải tạo một lớp con của junit.framework.TestCase. Sau đó, cần phải định nghĩa một hàm tạo lấy Chuỗi làm tham số - tên của phương thức - và chuyển nó đến lớp cha. Mỗi phương pháp thử nghiệm phải bắt đầu bằng thử nghiệm tiền tố. Các phương thức setUp và TearsDown được sử dụng để khởi tạo và giải phóng tài nguyên. Tóm lại là kinh dị. Vâng, bây giờ mọi thứ đều đơn giản, vâng.

Đó là tất cả cho ngày hôm nay. Tôi chắc chắn JUnit Framework sẽ giúp ích cho bạn rất nhiều. Bình luận và câu hỏi về bài viết đều được chào đón.