Số cuộc gọi giả python
Plugin này cài đặt một bộ cố định mô phỏng là một trình bao bọc mỏng xung quanh API vá do gói mô phỏng cung cấp, nhưng với lợi ích là không phải lo lắng về việc hoàn tác các bản vá khi kết thúc thử nghiệm Show
Nếu bạn thấy thư viện này hữu ích, hãy đóng góp một số chu kỳ CPU cho nỗ lực phát triển của nó bằng cách nhấp vào bên trên. Cảm ơn bạn. 😇 Tại sao phải bận tâm với một plugin?Có một số cách sử dụng bản vá khác nhau trong API giả tiêu chuẩn, nhưng IMHO chúng không mở rộng quy mô tốt khi bạn có nhiều hơn một hoặc hai bản vá để áp dụng Nó có thể dẫn đến việc lồng quá nhiều câu lệnh with, phá vỡ quy trình của bài kiểm tra
Người ta có thể sử dụng bản vá làm công cụ trang trí để cải thiện quy trình kiểm tra
Nhưng điều này gây ra một số nhược điểm
Lưu ý về cách sử dụng làm trình quản lý ngữ cảnh Mặc dù API của mocker cố ý giống như mock. bản vá, việc sử dụng nó làm trình quản lý bối cảnh và trình trang trí chức năng không được hỗ trợ thông qua lịch thi đấu. Mục đích của plugin này là sử dụng trình quản lý bối cảnh và trình trang trí chức năng để chế nhạo không cần thiết. Thật vậy, cố gắng sử dụng chức năng trong mocker theo cách này có thể dẫn đến các lỗi không trực quan
Tuy nhiên, bạn có thể sử dụng mocker. mock_module để truy cập mô-đun giả bên dưới, e. g. để trả lại một trình quản lý bối cảnh trong một vật cố định tạm thời chế nhạo một cái gì đó Chất lượng công việc là một trong những yếu tố quan trọng quyết định thành công của bạn tại nơi làm việc. Có nhiều cách để thực hiện điều này trong lĩnh vực công nghệ phần mềm. Nhưng có một cách dễ dàng và hiệu quả là áp dụng kiểm tra. Lý do đơn giản là khả năng viết mã đạt chất lượng thường quan trọng hơn nhiều so với việc viết một khối lượng lớn mã khó bảo trì và tồn tại nhiều lỗi 04 Điều Cần Chú Ý Cho Người Mới Làm Kiểm thử tự động Hiệu quả của thử nghiệm với TDD trong Laravel Kiểm tra đơn vị (Kiểm tra đơn vị) là kỹ thuật kiểm tra các khối thành phần nhỏ nhất trong phần mềm (thường là các hàm hoặc phương thức). Đây là một trong những cấp độ kiểm tra đơn giản và có thể bắt đầu sớm trong vòng đời phát triển phần mềm. Ngoài ra, bạn có thể viết bài kiểm tra đơn vị trước khi viết mã. Tuy nhiên, đây không phải là một thuật ngữ mới trong lĩnh vực phần mềm. Kiểm tra đơn vị khái niệm xuất hiện lần đầu trong ngôn ngữ lập trình Smalltalk vào những năm 1970. Đến nay, bài kiểm tra đơn vị gần như đã trở thành một tiêu chuẩn trong ngành theo mục tiêu của nó là phục vụ yêu cầu nâng cao chất lượng sản phẩm phần mềm
Với nhiều lập trình viên, dù mới vào nghề hay đã học giỏi, thì unit test là một trong những kỹ năng không thể thiếu khi đi làm. Nếu bạn chưa từng nghe qua hoặc chưa có điều kiện thực hiện thì hãy cùng bước những bước chân đầu tiên qua bài viết này nhé Bài viết này có gìVới bài viết này, bạn học được những nội dung sau
Lợi ích của Unit Testing
thuật ngữĐể đọc hiểu nội dung hướng dẫn này, bạn cần biết đến một số thuật ngữ thông thường được sử dụng trong các hoạt động kiểm tra trường hợp thử nghiệmTrường hợp thử nghiệm là các trường hợp cần kiểm tra với đầu vào và đầu ra được xác định cụ thể. Một trường hợp thử nghiệm thường có hai thành phần dưới đây
Sau khi thực hiện khối lệnh cần kiểm tra, chúng ta sẽ nhận được giá trị thực. Lấy giá trị đó để so sánh với giá trị dự kiến. Nếu hai giá trị này trùng khớp với nhau thì kết quả của trường hợp thử nghiệm là ĐẠT. Ngược lại, kết quả là FAIL Ứng dụng (hoặc Mã) Đang thử nghiệmỨng dụng đang thử nghiệm (AUT) là thuật ngữ thông thường được sử dụng để chỉ đến hệ thống/ứng dụng đang được kiểm tra. Với kiểm tra đơn vị hoạt động, các đơn vị kiểm tra của chúng tôi là những thành phần nhỏ nhất trong hệ thống nên có thể sử dụng các thuật ngữ khác nhau phù hợp hơn như Code Under Test (CUT) Mock và StubĐây là các thành phần bên ngoài được mô phỏng hoặc giả lập trong ngữ cảnh của hoạt động kiểm tra. Thông thường, để AUT hoạt động đúng chức năng thì cần đến những thành phần bên ngoài như Dịch vụ web, Cơ sở dữ liệu,… Ở cấp độ kiểm tra đơn vị, chúng ta cần phải tách rời các thành phần phụ thuộc này để có thể dễ dàng thực hiện . Phần này sẽ được giải thích rõ hơn trong mục Sử dụng Mockito (Mocking framework) Lưu ý. Ngoài thuật ngữ mock và stub, xin giới thiệu bạn sẽ gặp các từ khác nhau như Spy và Fake Thiết kế trường hợp thử nghiệmTrong phần này, chúng ta sẽ tìm hiểu các loại test case, cấu trúc thường gặp ở test case và xem xét một số yếu tố cấu thành nên một test case tốt. Dựa vào các đặc điểm đó, chúng ta sẽ tìm hiểu các nguyên tắc để có thể thiết kế và thực hiện được các test case tốt Phân loại test case
Vui lòng xác định các loại trường hợp thử nghiệm trên một ví dụ đơn giản như sau. Giả sử, chúng ta đang thiết kế ứng dụng đặt phòng khách sạn và có một yêu cầu là Hệ thống cho phép khách hàng có thể đặt phòng mới với thời gian xác định Với yêu cầu trên, chúng ta có một số trường hợp cần kiểm tra như sau
Hy vọng qua ví dụ trên, bạn có thể phân loại các trường hợp thử nghiệm và xác định rõ ràng các trường hợp thử nghiệm cho yêu cầu phần mềm mà bạn đang thực hiện Cấu hình một test caseCác mã cấu trúc mà chúng ta phải truy quét trong một trường hợp thử nghiệm là cấu trúc AAA. Cấu trúc này bao gồm 3 thành phần
Đôi khi bạn sẽ bắt gặp một số bài viết được sử dụng từ cấu trúc Cho-Khi-Thì. Về bản chất, cũng chính là cấu trúc AAA như trên Thành phần cố định (Fixtures)Là những phần được lặp lại thông qua từng trường hợp thử nghiệm và có thể chia sẻ các thao tác chung giữa các trường hợp thử nghiệm. Ví dụ. thiết lập cấu hình hoặc chuẩn bị dữ liệu trước khi bộ kiểm tra được thực thi và thu dọn bộ nhớ sau khi hoàn thành. Cố định phần thành phần phải được đặt trên cùng của cuộc kiểm tra Có bốn loại thành phần cố định chính Cài đặtIs into the part is done before the test case thực thi. Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi bài kiểm tra đơn vị), chúng ta thường gặp các phương thức/hàm hoặc chú thích có tên là BeforeEach. This section is Setup Cài đặt một lầnLà thành phần được thực hiện lần đầu tiên (trước khi cả thiết lập và trường hợp thử nghiệm được thực hiện). Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi bài kiểm tra đơn vị), chúng ta thường gặp các phương thức/hàm hoặc chú thích có tên là BeforeAll. Thành phần này chính là Thiết lập một lần Phá bỏThành phần được thực thi sau khi trường hợp thử nghiệm được thực thi. Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi bài kiểm tra đơn vị), chúng ta thường gặp các phương thức/hàm hoặc chú thích có tên là AfterEach. This section is Teardown Rớt Một LầnLà thành phần được thực thi sau cùng (sau khi tất cả test case và teardown được thực thi). Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi bài kiểm tra đơn vị), chúng tôi thường gặp các phương thức/hàm hoặc chú thích có tên là AfterAll. Thành phần này chính là One-Time Teardown Đặc tính của một bài kiểm tra đơn vị tốtMột ca kiểm tra tốt sẽ có những đặc điểm sau đây
Quy định đặt tênKiểm tra tên lớp chứa mã kiểm traTên lớp chứa mã kiểm tra thường sử dụng hậu tố “Kiểm tra” sau tên lớp được kiểm tra. Ví dụ. tên lớp là StockService thì tên lớp chứa mã kiểm tra sẽ là StockServiceTests Kiểm tra tên phương thức kiểm tra (trường hợp thử nghiệm)Theo nguyên tắc, tên phương thức kiểm tra phải giải thích nhiệm vụ rõ ràng. You can tham khảo một số quy định ướt đặt tên cho phương thức như sau
@Test public void favouriteStocksShouldbeSaved() {}
@Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}
@Test public void whenEnterValidUsernameAndPassword_thenLoginSuccessfully() {} Gợi ý viết kiểm tra tốt
Use JUnitHiện tại, JUnit đã được tích hợp và hỗ trợ phần lớn các IDE hiện có cho Java (như Eclipse, IntelliJ, NetBeans,…). Việc sử dụng JUnit trong các dự án Java không khó. Các bạn có thể tìm hiểu cách cài đặt thư viện cho dự án của mình thông qua các hướng dẫn trên mạng Trong mục này, chúng ta sẽ giống như các tính năng được hỗ trợ trong JUnit 5 – phiên bản mới nhất hiện nay ví dụ đầu tiênDưới đây là ví dụ giúp bạn có cái nhìn tổng quan về một bài kiểm tra được viết với JUnit5 import com.codegym.Calculator; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; class CalculatorTests { private final Calculator calculator = new Calculator(); @Test void shouldReturn2When1Plus1() { assertEquals(2, calculator.add(1, 1)); } } Giải thích ví dụ
Các mục tiếp theo sẽ cung cấp thêm chi tiết về một số tính năng cơ bản được hỗ trợ trong JUnit5 Các annotation trong JUnitSơ đồ dưới đây có thể hiển thị thứ tự thực hiện các phương thức khi được đánh dấu bằng chú thích tương ứng Chú thích @B BeforeAll, @B BeforeEach,@afterEach, @afterAll là các thành phần cố định, thực hiện các chức năng lặp lại chức năng. Chú thích @Test được sử dụng để xác định một trường hợp thử nghiệm khẳng địnhCác xác nhận là lớp chứa các phương thức hỗ trợ Đánh giá các điều kiện trong quá trình kiểm tra Vì vậy, với phiên bản trước, JUnit 5 vẫn giữ nguyên các phương thức cũ và bổ sung một số phương thức mới tận dụng các tích năng của Java 8 Dưới đây là danh sách các xác nhận phương thức có trong JUnit5 khẳng địnhTrue và khẳng địnhFalsePhương thức assertTrue được sử dụng để kiểm tra kết quả của điều kiện có bằng đúng hay không. Ví dụ ________số 8assertEquals và assertNotEqualsPhương thức assertEquals được sử dụng để kiểm tra giá trị mong đợi và thực tế có bằng nhau hay không. Ví dụ assertEquals và assertNotEquals Phương thức assertEquals được dùng để kiểm tra giá trị mong đợi và thực tế có bằng nhau hay không. Ví dụ: Ngược lại, Phương thức assertNotEquals được sử dụng để kiểm tra giá trị mong đợi và thực tế có bằng nhau hay không. Chúng ta cập nhật lại ví dụ ở trên 0Với trường hợp các giá trị mà chúng ta so sánh thuộc kiểu Đối tượng, assertEquals và assertNotEquals sẽ gọi phương thức bằng để so sánh giá trị Có một điểm cần lưu ý nếu giá trị là kiểu số thực (float or double). Trên thực tế, có nhiều trường hợp mà giá trị thực được mong đợi và thực tế có thể chênh lệch với nhau trong khoảng chấp nhận được. Với tình huống này, phương thức assertEquals và assertNotEquals giúp tham số thứ ba là delta (bên cạnh mong đợi và thực tế). Chúng ta cùng xem qua ví dụ dưới đây 1Kết quả được phép chia 12 cho 3. 001 then will be a number of 3. 9998667. Kết quả của cuộc kiểm tra ví dụ trên đã được THÔNG QUA vì chúng ta đã cho phép độ chênh lệch tối đa là 0. 001 khẳng địnhArrayEqualsPhương thức assertArrayEquals có thể xác nhận mảng mong đợi và thực tế có bằng nhau hay không. Chúng ta cùng xem xét ví dụ dưới đây 2khẳng địnhSame và khẳng địnhNotSameChúng ta muốn xác nhận giá trị mong đợi và tham chiếu thực tế đến cùng một đối tượng hay không, chúng ta phải sử dụng assertSame hoặc assertNotSame 3Kết quả của bài kiểm tra phương thức trên là KHÔNG THÀNH CÔNG vì hai biến thực tế và dự kiến đang tham chiếu đến hai đối tượng khác nhau trong bộ nhớ Chúng ta nên lưu ý về sự khác nhau giữa assertSame và assertEquals (đã tìm hiểu ở ví dụ trước)
khẳng địnhIterableEqualsassertIterableEquals so sánh các giá trị được chứa bên trong hai đối tượng kiểu Iterable. To return results PASSED, two iterable must pay return by number of phantal, value of that parts and both position of the other section. Hãy cùng xem ví dụ dưới đây @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}0 Kết quả của test case on PASSED. Phương thức assertIterableEquals chỉ so sánh giá trị của các phần tử bên trong mà không quan tâm đến việc các phần tử này đang được lưu trữ tại hai biến thuộc kiểu khác nhau (ArrayList và LinkedList) khẳng địnhNémĐể có thể xác nhận phương thức đang được kiểm tra có thể ném ra một ngoại lệ hay không, chúng ta có thể sử dụng assertThrows. Giả sử chúng ta có một phương thức như sau @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}1 Sử dụng cách thức dưới đây để kiểm tra xem phương thức throwAnExcepint() có ném ra một ngoại lệ hay không, và ngoại lệ đó phải là IllegalArgumentException hay không @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}2 Các khẳng định khác nhau
Sử dụng Mockito (Mocking framework)Khi xây dựng phần mềm, AUT sẽ phụ thuộc vào các thành phần bên ngoài như cơ sở dữ liệu, API, tệp hệ thống,… Các thành phần phụ thuộc này có thể chưa có sẵn hoặc thậm chí chưa tồn tại tại thời điểm chúng tôi sử dụng. . Ngay cả khi các thành phần này đã được chuẩn bị sẵn sàng, thì việc thực hiện một trường hợp thử nghiệm có phụ thuộc sẽ chậm hơn vì phải cần thời gian chờ đợi và tương tác với các thành phần bên ngoài Cô lập AUT là một trong những kỹ thuật giúp giải quyết vấn đề trên. Và lúc này, chúng ta sẽ cần đến các khung mô phỏng (tạm dịch là khung mô phỏng) để giả lập các thành phần bên ngoài, nhờ đó có thể cô lập và kiểm tra AUT dễ dàng hơn. Đối tượng mô phỏng này sẽ không gây phá vỡ cấu trúc mã nguồn khi đối tượng thực được thiết kế và triển khai. Hình dưới đây có thể thực hiện việc tạo hai đối tượng mô phỏng là Mock WS và Mock DB để thay thế sự phụ thuộc vào WebService và Database Việc tìm hiểu cách thiết lập và sử dụng các mocking framework này là bước quan trọng giúp mở rộng Unit Test cho các hệ thống lớn và phức tạp. Với lập trình viên Java, Mockito là một công cụ không thể thiếu Tạo đối tượng mô phỏngPhương thức mock() cho phép chúng ta tạo đối tượng mô phỏng từ một lớp hoặc giao diện. Phương thức này không yêu cầu thêm gì khi sử dụng. Và nó có thể tạo các lớp mô phỏng thuộc tính hoặc các đối tượng mô phỏng cần sử dụng trong phương thức. Ví dụ dưới đây có thể hiện cách tạo một đối tượng mô phỏng kiểu UserRepository (đã được định nghĩa trước đó) @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}3 Mô phỏng hành động viSử dụng phương thức khi() để mô phỏng hành vi của đối tượng. Để xác định kết quả thực hiện, chúng ta có thể sử dụng thenReturn() or thenThrow()
@Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}3 Nếu muốn trả lại nhiều kết quả cho nhiều lần gọi, chúng ta sẽ sử dụng thenReturn() nhiều lần như sau; @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}5 kiểm chứngChúng ta có thể kiểm tra xem phương thức/hàm có được gọi hay không thông qua phương thức xác minh() @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}3 Mockito hỗ trợ những tham số giúp chúng ta có thể mở rộng khả năng kiểm tra việc gọi phương thức như
Ví dụ @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}7 Kết hợp JUnitĐây là đoạn mã ví dụ cách kết hợp Mockito và JUnit để viết mã kiểm tra đơn vị @Test public void GivenNullUsernameWhenCreateStudentThenShouldThrowException() {}8 Ở phương thức trên, chúng ta mô phỏng hành vi lấy lượng người dùng thông qua phương thức count() được định nghĩa trong UserRepository. Khi count() được gọi, đối tượng mô phỏng sẽ trả về kết quả là 111 thay vì phải truy vấn vào cơ sở dữ liệu để lấy thông tin nghiên cứu điển hìnhDự án mà chúng ta sẽ thực hiện là một trang cửa hàng trực tuyến đơn giản hỗ trợ duyệt danh sách sản phẩm và thông tin chi tiết của từng mặt hàng. Khách hàng có thể chọn sản phẩm và lưu vào giỏ hàng để thanh toán Trước khi thực hiện việc viết mã, hãy thiết kế chi tiết bao gồm các giao diện, lớp và các phương thức có thể cần để thực hiện ứng dụng này. dựa vào bản thiết kế, hãy viết các trường hợp thử nghiệm đơn vị cho ứng dụng Chặn đường tiếp theoCảm ơn bạn đã đồng hành cùng bài viết đến đây. Hy vọng những bước chân đầu tiên này sẽ mang lại nhiều ý nghĩa cho con đường học hỏi tiếp theo của bạn. Hãy tìm ngăn nắp và thực hiện hành động nhiều hơn để có thể làm chủ được kỹ năng Unit Test nói riêng và kiểm thử tự động nói chung. Đến đây, chúng ta nên làm gì để học và thực hiện hiệu quả hơn ở kỹ năng này? Câu châm ngôn của mình là “Thế giới này thật là rộng lớn. and has too many books to read”. Nên nhắc đầu tiên luôn là đọc những cuốn sách đầu tiên hay về Unit Test, Test-Driven Development và những chủ đề liên quan. Các bạn xem qua gợi ý sách và trang web bên dưới nhé |