Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Giới thiệu về Unit Test

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Giới thiệu về Unit Test

    Unit là thành phần nhỏ nhất mà chúng ta có thể kiểm tra được.VD: function, procedure, class hoặc method.

    Mỗi Unit Test đều được thiết kế theo trình tự sau:
    • Thiết lập các điều kiện cần thiết: khởi tạo các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả…
    • Gọi các phương thức cần kiểm tra.
    • Kiểm tra sự hoạt động đúng đắn của các phương thức.
    • Dọn dẹp tài nguyên sau khi kết thúc kiểm tra.
    Để có thể hiểu đúng hơn về unit test, chúng ta nên biết về TDD (Test-Driven Development), là một quy trình phát triển phần mềm, bao gồm 5 bước:
    • Write tests
    • Run these tests – must fail
    • Write source code
    • Run these tests – must pass
    • Refactor the code
    Vào giai đoạn đầu tiên phát triển phần mềm, chúng ta phải nắm chắc được những chức năng cần phát triển, thông số đầu vào của chức năng và kết quả mong đợi của chức năng đó. Nếu chúng ta không viết test trước mà viết code luôn thì khi chạy code sẽ không chắc chắn được đầu vào và đầu ra đã bao phủ hết tất cả các trường hợp có thể xảy ra hay chưa. Khi viết một đoạn test, người phát triển phải hiểu rõ các yêu cầu và đặc điểm kỹ thuật của tính năng, làm cho người phát triển tập trung vào các yêu cầu trước khi viết code. Lợi ích của việc này là giúp ta thấy được những chi tiết còn mơ hồ và bỏ sót trước khi bắt đầu viết code, tránh được việc phải sửa hay thậm chí viết lại code.
    Vậy nên unit test là một quá trình thiết kế chứ không phải là quá trình kiểm thử.


  • #2
    Lâu quá mới trở lại diễn đàn (tính bằng đơn vị năm :D), thôi viết tí mừng ngày trở lại.

    Đọc cái unittest trên thấy lý thuyết quá, viết lại tí cho đơn giản dễ hiểu.
    Unit là thành phần nhỏ nhất mà chúng ta có thể viết chương trình để kiểm tra sự hoạt động của nó. Ví dụ, giờ chúng ta mở đèn xe không lên, thì nguyên nhân có thể là gì? cháy bóng? hết ắc quy? hay chuột cắn đứt dây điện? Muốn biết nguyên nhân vì sao thì chỉ có cách đi kiểm tra từng cái thôi. Mỗi cái đó là một Unit.

    Trong công ty thì có ông Dev với ông Tester. Thông thường ta sẽ nghĩ ông Tester phải đợi ông Dev phát triển xong chức năng rồi mới test được, mà đợi vậy thì biết tới bao giờ. Giờ ta nghĩ vầy, giả sử công ty yêu cầu phát triển hàm add(a,b) có chức năng cộng hai số a và b. Ông Tester chả cần biết ông Dev viết hàm đó ra làm sao, nhưng biết rằng nếu nhập vào 2 số 2 và 3 thì kết quả dứt khoát phải là 5, nếu kết quả không bằng 5 thì ông Dev phải mò cho ra lỗi ở đâu mà sửa. Vậy thì ông Tester viết ra 1 chương trình để test cái hàm này, rồi đợi ông Dev đưa code qua ráp vô chạy. Các bạn thấy hay không? người ta còn viết test trước khi có cả code để chạy.

    Rồi, áp dụng vô Python thì sao? Python cũng có nhiều package để hỗ trợ cái vụ unittest này lắm. Built-in thì có thư viện unittest, cũng mạnh nhưng viết thì hơi phức tạp chút. Package ngoài thì có như nose, pytest. Giờ mình hướng dẫn viết 1 cái unittest với pytest nhé.

    Đầu tiên, cài pytest cái đã.
    $ pip install pytest

    Rồi viết 1 file calculator.py có nội dung vầy:
    Code:
    def add(x, y):
    return x + y
    def subtract(x, y):
    return x - y
    def mutiply(x, y):
    return x * y
    def devide(x, y):
    return x / y
    Viết tiếp file test_calculator.py (tên file phải có chữ test ở đầu để pytest nhận diện đây là file unittest):
    Code:
    import calculator
    def test_add():
    assert calculator.add(2,3) == 5
    def test_subtract():
    assert calculator.subtract(5,2) == 4
    def test_multiply():
    assert calculator.mutiply(2,3) == 6
    def test_devide():
    assert calculator.devide(6,3) == 1
    Rồi ra cái folder chứa 2 file calculator.py và test_calulator.py, chạy lệnh:
    $ py.test
    Code:
    ❯ py.test
    ======================================= test session starts ========================================
    platform darwin -- Python 3.7.7, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
    rootdir: /Users/hoanbq/Python/code/unittest
    collected 4 items
    
    test_sample.py .F.F [100%]
    
    ============================================= FAILURES =============================================
    __________________________________________ test_subtract ___________________________________________
    
    def test_subtract():
    > assert calculator.subtract(5,2) == 4
    E assert 3 == 4
    E + where 3 = <function subtract at 0x10ef83560>(5, 2)
    E + where <function subtract at 0x10ef83560> = calculator.subtract
    
    test_sample.py:7: AssertionError
    ___________________________________________ test_devide ____________________________________________
    
    def test_devide():
    > assert calculator.devide(6,3) == 1
    E assert 2.0 == 1
    E + where 2.0 = <function devide at 0x10ef83680>(6, 3)
    E + where <function devide at 0x10ef83680> = calculator.devide
    
    test_sample.py:13: AssertionError
    ===================================== short test summary info ======================================
    FAILED test_sample.py::test_subtract - assert 3 == 4
    FAILED test_sample.py::test_devide - assert 2.0 == 1
    =================================== 2 failed, 2 passed in 0.13s ====================================
    Mình có 4 cái test tất cả. Các bạn thây trong code mình cố tình để sai ở 2 hàm là test_subtract và test_devide. Kết quả là chương trình báo có 2 failed và 2 passed. Nó cũng báo rõ là sai ở hàm nào. Rồi, giờ thì lôi đầu ông Dev vô mà sửa lại thôi hen.

    ​​​​​​​Thanks for reading.
    Từ nay quyết chí đi tu, ráng luyện công mong ngày thành chính quả. Nam mô a di đà phật. Thiện tai. Thiện tai.

    Comment

    Working...
    X