Tdd là gì ý học
TDD là gì, code ít bug hơn với TDDMục lục
I. Testing là gìTrong phạm trù phần mềm học thì testing là một bước trong quy trình phát triển phần mềm. Mục đích của testing là đảm bảo phần mềm chạy đúng theo yêu cầu. Tùy vào từng quy trình phát triển phần mềm mà testing có thể xuất hiện ở các bước khác nhau. Như trong quy trình phát triển phần mềm Thác nước, thì testing (kiểm thử) nằm ở bước thứ 4. Các bước trong quy trình phát triển phần mềm thác nước Có thể bạn chưa biết Testing có thể thực hiện bằng sức người, tức là con người sẽ trực tiếp thao tác trên phần mềm để tìm lỗi. Hoặc cũng có thể thực hiện qua các công cụ test tự động, người dùng sẽ đưa ra các kịch bản test kèm kết quả mong muốn, nó sẽ chạy và so sánh kết quả thực tế và kết quả mong muốn để phát hiện lỗi. II. Testing Driven Development2.1 TDD là gì?TDD (Testing Driven Development Phát triển hướng kiểm thử) là một quy trình phát triển phần mềm mà bước kiểm thử được thực hiện trước bước phát triển (tức là test trước khi code). Ấy mà khoan, chưa code thì lấy cái gì để mà test nhỉ Đây cũng chính là điểm khác biệt của TDD với quy trình phát triển phần mềm truyền thống. Bạn cứ đọc hết bài viết sẽ rõ. 2.2 TDD được thực hiện như thế nào?TDD được thực hiện qua các bước sau:
Bạn sẽ hiểu rõ hơn khi chúng ta thực hiện ví dụ qua phần III. III. Ví dụ về TDDLý thuyết vậy là đủ, giờ chúng ta sẽ thực hiện một ví dụ đơn giản theo quy trình TDD để hiểu rõ hơn về nó. Bài toán Mình sẽ sử dụng PHP để triển khai bài toán trên, và sử dụng PHPUnit để làm công cụ test tự động. Bước 1: Setup các thứTạo thư mục làm việc và cài đặt phpunit. mkdir tdd && cd tdd && mkdir src && mkdir tests composer require --dev phpunit/phpunit ^9Chỉnh sửa file composer.json cho giống như sau: {
"autoload": {
"classmap": [
"src/"
]
},
"require-dev": {
"phpunit/phpunit": "^9"
}
}
Chạy autoload composer dump-autoloadTạo file src/FizzBuzz.php với nội dung như sau: Tạo file tests/FizzBuzzTest.php với nội dung như sau: Bước 2: Triển khai TDDChúng ta đã có đầy đủ nguyên liệu, giờ sẽ bắt đầu triển khai TDD. Bước 1: Tạo test case đầu tiên và đảm bảo nó failMình sẽ tạo test case cho trường hợp trả về chữ Fizz, nếu N chia hết cho 3 trước. assertEquals($actual, $expect);
}
}
Chạy thử bằng lệnh ./vendor/bin/phpunit testsVà kết quả là: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 00:00.026, Memory: 4.00 MB There was 1 failure: 1) FizzBuzzTest::testFizz Failed asserting that 'Fizz' matches expected null. /home/vagrant/www/pets/phpunit/tests/FizzBuzzTest.php:13 FAILURES! Tests: 1, Assertions: 1, Failures: 1.Bạn thấy đó, nó sẽ báo Failures: 1, tức là có 1 test case bị fail. Đương nhiên, vì mình chưa code gì mà. Bước 2: Code để pass test case đầu tiênChúng ta sẽ sửa lại code trong file src/FizzBuzz.php như sau: Bằng cách đơn giản nhất, mình chỉ cần return 'Fizz' thì chắc chắn là sẽ pass. Nhưng cứ chạy lại test cho chắc. ./vendor/bin/phpunit testsVà kết quả là: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 00:00.021, Memory: 4.00 MB OK (1 test, 1 assertion)Kết quả trên nghĩa là mọi test case đã pass. Bước 3: Bổ sung thêm test case mớiMình sẽ tạo tiếp test case cho trường hợp trả về Buzz nếu N chia hết cho 5. Bổ sung thêm test case trong file tests/FizzBuzzTest.php như sau: assertEquals($actual, $expect);
}
}
Chạy thử ./vendor/bin/phpunit testsVà kết quả là: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. .F 2 / 2 (100%) Time: 00:00.019, Memory: 4.00 MB There was 1 failure: 1) FizzBuzzTest::testBuzz Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'Fizz' +'Buzz' /home/vagrant/www/pets/phpunit/tests/FizzBuzzTest.php:22 FAILURES! Tests: 2, Assertions: 2, Failures: 1.Nó báo là test case testBuzz bị sai, kết quả mong muốn là Buzz nhưng kết quả thực tế lại là Fizz. Đương nhiên, vì hàm FizzBuzz::run() luôn trả về chữ Fizz mà. Bước 4: Tiếp tục code để pass qua test case mớiChúng ta sẽ sửa lại code trong file src/FizzBuzz.php như sau: Chạy lại xem kết quả thế nào ./vendor/bin/phpunit testsVà kết quả là: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. .. 2 / 2 (100%) Time: 00:00.014, Memory: 4.00 MB OK (2 tests, 2 assertions)Vậy là tất cả test case đã pass. Bước 5: Lặp đi lặp lại các bước tương tự 3 4Chúng ta còn 2 trường hợp nữa là: Trả về FizzBuzz khi N chia hết cho cả 3 và 5 Bổ sung thêm test case trong file tests/FizzBuzzTest.php như sau: assertEquals($actual, $expect);
}
}
Kết quả chạy test sau khi có test case mới: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. ..F 3 / 3 (100%) Time: 00:00.028, Memory: 4.00 MB There was 1 failure: 1) FizzBuzzTest::testFizzBuzz Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'Fizz' +'FizzBuzz' /home/vagrant/www/pets/phpunit/tests/FizzBuzzTest.php:31 FAILURES! Tests: 3, Assertions: 3, Failures: 1.Kết quả là fail và fail ở test case testFizzBuzz. Sửa lại code trong file src/FizzBuzz.php như sau: Kết quả chạy lại sau khi sửa code là: OK, vậy là đã pass. Trả về N nếu là các trường hợp còn lại Tiếp tục bổ sung thêm test case: assertEquals($actual, $expect);
}
}
Kết quả chạy test sau khi có test case mới PHPUnit 9.3.9 by Sebastian Bergmann and contributors. F 4 / 4 (100%) Time: 00:00.026, Memory: 4.00 MB There was 1 failure: 1) FizzBuzzTest::testOthers Failed asserting that 11 matches expected null. /home/vagrant/www/pets/phpunit/tests/FizzBuzzTest.php:40 FAILURES! Tests: 4, Assertions: 4, Failures: 1.Kết quả là fail và fail ở test case testOthers. Sửa lại code trong file src/FizzBuzz.php như sau: Kết quả test sau khi sửa code: PHPUnit 9.3.9 by Sebastian Bergmann and contributors. . 4 / 4 (100%) Time: 00:00.020, Memory: 4.00 MB OK (4 tests, 4 assertions)Vậy là đã pass tất cả các test case. Bước 6: Refactor codeRefactor code là chỉnh lại code sao cho gọn gàng, dễ hiểu, vì trong quá trình bổ sung thêm code mới có thể làm code tổng thể trở nên rối rắm, khó hiểu. Nhưng vì ví dụ này quá đơn giản nên không có gì để refactor cả. Lưu ý IV. Tổng kếtTDD đơn giản là viết test case trước và implement code sau, nghe qua tưởng dở, thế nhưng khi áp dụng thì lại thấy hay, bởi:
Một số lưu ý khi áp dụng TDD:
Sau cùng, liệu bạn có áp dụng TDD trong dự án tiếp theo? Phạm Bình https://phambinh.net Là một lập trình viên; Thích tìm hiểu và chia sẻ kiến thức công nghệ; Thích chiêm nghiệm cuộc sống |