JavaRush /Blog Java /Random-VI /Nghỉ giải lao #87. Tại sao thử nghiệm đơn vị lại quan trọ...

Nghỉ giải lao #87. Tại sao thử nghiệm đơn vị lại quan trọng đối với nhà phát triển? 5 cách để sao chép một mảng trong Java

Xuất bản trong nhóm

Tại sao thử nghiệm đơn vị lại quan trọng đối với nhà phát triển?

Nguồn: SearchSoftwareQuality Hãy thảo luận tại sao thử nghiệm đơn vị lại quan trọng và có giá trị cũng như cách nó giúp việc gỡ lỗi dễ dàng hơn. Kiểm thử đơn vị là một công cụ mạnh mẽ để cải thiện chất lượng phần mềm. Kiểm thử đơn vị cung cấp xác minh cơ bản rằng ứng dụng tuân thủ các thông số kỹ thuật của phần mềm và hoạt động như dự định. Nghỉ giải lao #87.  Tại sao thử nghiệm đơn vị lại quan trọng đối với nhà phát triển?  5 cách sao chép một mảng trong Java - 1Khi thực hiện tốt, kiểm tra đơn vị:
  • giảm số lượng lỗi và xác định chúng ở giai đoạn đầu của vòng đời phát triển;
  • cải thiện khả năng đọc mã;
  • cho phép tái sử dụng mã;
  • tăng tốc độ triển khai.
Hãy xem tại sao thử nghiệm đơn vị lại quan trọng, loại thử nghiệm này có nguồn gốc như thế nào và những rào cản đối với việc thực hiện nó là gì.

Lịch sử kiểm tra đơn vị

Một lỗi được phát hiện ở giai đoạn đầu sẽ tiết kiệm thời gian và công sức. Trong 50 năm đầu tiên của lịch sử máy tính, việc kiểm tra đơn vị và gỡ lỗi về cơ bản là giống nhau. Nhưng đến những năm 1990, mã đã trở nên phức tạp đến mức thường không thể chia hệ thống thành các phần nhỏ để chạy chúng một cách riêng biệt. Năm 1997, một lập trình viên tên Kent Beck đã tạo ra JUnit, một plugin môi trường phát triển để thử nghiệm các đoạn mã nhỏ. Mã kiểm tra đánh giá mã nguồn được gọi là kiểm tra đơn vị. Loại thử nghiệm đơn vị này đã trở thành một phần chủ yếu trong nhiều năm. Sau khi Beck tạo ra JUnit, Martin Fowler đã viết một cuốn sách, Tái cấu trúc, trong đó ông đề xuất các cách chuyển đổi mã để làm cho nó tách biệt và dễ kiểm tra hơn. Sự kết hợp giữa tái cấu trúc mã và thử nghiệm đơn vị đã dẫn đến sự phát triển dựa trên thử nghiệm, trong đó việc tạo ra các thử nghiệm đơn vị là điều cần thiết cho quá trình lập trình. Trong đó, mã phải có thể kiểm tra được ngay cả trước khi nó được tạo. Do đó, quá trình lập trình không được hoàn thành cho đến khi chạy thử nghiệm đơn vị. Dự án sau đó có thể chuyển sang giai đoạn nghiên cứu ở cấp độ hệ thống hoặc con người.

Ví dụ kiểm tra đơn vị

Ví dụ này cho thấy tầm quan trọng của thử nghiệm đơn vị. Ở đây JUnit đánh giá một hàm đơn giản chuyển đổi nhiệt độ từ độ F sang độ C. Công thức chuyển đổi: C = (F-32) * 5/9. Chỉ một vài dòng, bao gồm chữ ký hàm và dấu ngoặc nhọn, có thể được triển khai trong mã dưới dạng hàm thư viện. Tuy nhiên, chức năng này không nói rõ đây là những tiêu chí. Các tùy chọn này có thể bao gồm làm tròn lên hoặc xuống, số thực hoặc giới hạn trên và dưới. Hãy tạo các bài kiểm tra đơn vị mẫu cho hàm chuyển đổi nhiệt độ này trong Perl bằng cách sử dụng mô-đun Test::More. Dòng đầu tiên là nhận xét cho người lập trình biết điều gì sẽ xảy ra ở đoạn mã còn lại.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
Khung JUnit dựa trên các hệ thống hướng đối tượng và các đối tượng thử nghiệm, nhưng khái niệm này tương tự nhau.

Kiểm tra đơn vị bị cô lập

Một trong những lợi ích của kiểm thử đơn vị là chúng tách biệt một hàm, lớp hoặc phương thức và chỉ kiểm tra đoạn mã đó. Các thành phần riêng lẻ tốt hơn mang lại khả năng phục hồi toàn bộ hệ thống. Bằng cách này bạn có được mã đáng tin cậy. Kiểm tra đơn vị cũng thay đổi bản chất của quá trình gỡ lỗi. Để cố gắng sửa lỗi, các lập trình viên chỉ cần viết một bài kiểm tra thất bại và sau đó lặp lại nó để nó vượt qua mà không vi phạm những kỳ vọng trước đó. Quá trình này loại bỏ chu trình gỡ lỗi thủ công truyền thống thông qua thiết lập, tạo lại, tạm dừng và kiểm tra. Để thay đổi mã sao cho phù hợp với việc kiểm thử đơn vị, lập trình viên phải thay đổi cách làm việc. Bất kỳ đoạn mã nào được viết mà không có kiểm tra đơn vị sẽ có thể được coi là chưa được kiểm tra, ít nhất là dưới dạng các mô-đun riêng lẻ.

Điều chỉnh các bài kiểm tra đơn vị

Phần mềm kế thừa là phần mềm đã chạy trong một thời gian dài và rất có thể được viết mà không cần kiểm tra đơn vị. Mã kế thừa có giá trị cho công ty. Nó hoạt động ổn định trong nhiều năm. Một số chương trình được xây dựng mà không cần kiểm tra đơn vị xử lý các giao dịch trị giá hàng triệu đô la mỗi ngày. Nhưng mã không có bài kiểm tra đơn vị sẽ biến thành một cục đất lớn theo thời gian vì nó đã được nhiều lập trình viên bảo trì mã chạm vào trong nhiều năm. Tái cấu trúc cho phép các lập trình viên dần dần thực hiện các thay đổi đối với hệ thống để làm cho hệ thống có thể kiểm tra được. Tuy nhiên, những thay đổi này cần có thời gian. Vài năm trước, tôi đã thảo luận với đồng nghiệp Bob Reselman về vấn đề sử dụng bài kiểm tra đơn vị cho các ứng dụng cũ. Reselman lập luận rằng việc triển khai thử nghiệm đơn vị trong các ứng dụng được xây dựng mà không có nó là quá tốn kém và thậm chí là ngu ngốc. Thay vào đó, ông khuyến nghị tổ chức nên bắt đầu quá trình phát triển mới bằng các bài kiểm tra đơn vị và giữ nguyên các ứng dụng cũ. Điều này có thể đúng với COBOL, trình tạo báo cáo và các ứng dụng khác, nhưng tôi cho rằng trong các ứng dụng được viết bằng ngôn ngữ hiện đại—C++, C#, Java và Ruby—việc thêm các bài kiểm tra đơn vị về trước là khá dễ dàng. Thay vì viết chúng cho toàn bộ ứng dụng, bạn chỉ cần thêm các bài kiểm tra đơn vị vào thay đổi hiện tại và tái cấu trúc khi thực hiện.

Tăng tốc độ, chất lượng và khả năng kiểm tra

Các nhà quản lý dự án cho rằng việc lập kế hoạch liên quan đến sự cân bằng giữa chất lượng, số lượng công việc đã hoàn thành, nguồn lực và thời gian. Để thêm thứ gì đó vào một khu vực, bạn phải lấy đi thứ gì đó từ khu vực khác. Kiểm tra đơn vị hiệu quả phá vỡ quy tắc này. Đây là lý do tại sao thử nghiệm đơn vị lại quan trọng và có giá trị đối với các tổ chức. Các bài kiểm tra đơn vị tốt tạo ra mã có thể kiểm tra được giúp cải thiện chất lượng. Mã này sẽ có ít lỗi hơn, đồng nghĩa với việc sửa lỗi ít hơn để hoàn thành dự án nhanh hơn. Khi phần mềm gặp lỗi, unit test sẽ tăng tốc độ gỡ lỗi, sửa lỗi và viết mã. Và điều này xảy ra theo cách mà khả năng tái diễn lỗi sẽ giảm đáng kể đồng thời cải thiện chất lượng và tốc độ của mã. Mặc dù không có phép màu nào trong phát triển phần mềm, nhưng các bài kiểm tra đơn vị hiệu quả có thể tăng tốc độ phát triển, kiểm tra và thậm chí một số kỹ thuật yêu cầu chức năng.

5 cách để sao chép một mảng trong Java

Nguồn: Dev.to Vậy là bạn có hai mảng A và B và bạn cần sao chép các phần tử từ A sang B. Có nhiều cách khác nhau để thực hiện việc này trong Java và tôi sẽ chỉ cho bạn ngay bây giờ.

Phương pháp một: ForLoop

Đây là lúc vòng lặp for cũ phát huy tác dụng :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

Phương pháp hai: .clone()

Phương pháp nhân bản mảng cũng có thể giúp đạt được kết quả mong muốn:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Phương pháp ba: System.arraycopy()

Cách tiếp theo là sử dụng phương thức System.arraycopy() , nằm trong gói java.lang . Trước khi chúng ta chuyển sang sử dụng nó, hãy thảo luận về chữ ký của nó:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
Ứng dụng:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

Phương pháp bốn: Arrays.copyOf()

Tùy chọn sao chép tiếp theo mà chúng ta sẽ thảo luận là lớp Arrays từ gói java.utils . Hãy chú ý đến chữ ký của anh ấy:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Ứng dụng:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Phương pháp năm: Arrays.copyOfRange()

Vì vậy, đây sẽ là lựa chọn cuối cùng mà chúng ta sẽ xem xét trong bài đăng này. Nó cũng thuộc lớp Arrays có trong gói java.utils . Hãy nhìn vào chữ ký của anh ấy một lần nữa:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
Ứng dụng:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION