Kiểm thử đơn vị

Nguyên tắc Kỹ thuật Phần mềm với Python

Adam Spannbauer

Machine Learning Engineer at Eastman

Vì sao cần kiểm thử?

  • Xác nhận mã chạy đúng như dự định
  • Đảm bảo thay đổi ở một hàm không làm hỏng hàm khác
  • Bảo vệ trước thay đổi từ phụ thuộc
Nguyên tắc Kỹ thuật Phần mềm với Python

Kiểm thử trong Python

  • doctest
  • pytest

logo pytest

Nguyên tắc Kỹ thuật Phần mềm với Python

Dùng doctest

def square(x):
    """Square the number x

    :param x: number to square
    :return: x squared

    >>> square(3)
    9
    """
    return x ** 3


import doctest doctest.testmod()
Failed example:
    square(3)
Expected:
    9
Got:
    27
Nguyên tắc Kỹ thuật Phần mềm với Python

Cấu trúc pytest

Cấu trúc kiểm thử

Nguyên tắc Kỹ thuật Phần mềm với Python

Cấu trúc pytest

Cấu trúc kiểm thử

Nguyên tắc Kỹ thuật Phần mềm với Python

Viết unit test

làm việc trong workdir/tests/test_document.py

from text_analyzer import Document


# Test tokens attribute on Document object
def test_document_tokens():
    doc = Document('a e i o u')

    assert doc.tokens == ['a', 'e', 'i', 'o', 'u']

# Test edge case of blank document def test_document_empty(): doc = Document('') assert doc.tokens == [] assert doc.word_counts == Counter()
Nguyên tắc Kỹ thuật Phần mềm với Python

Viết unit test

# Create 2 identical Document objects
doc_a = Document('a e i o u')
doc_b = Document('a e i o u')

# Check if objects are ==
print(doc_a == doc_b)

# Check if attributes are == print(doc_a.tokens == doc_b.tokens) print(doc_a.word_counts == doc_b.word_counts)
False

True True
Nguyên tắc Kỹ thuật Phần mềm với Python

Chạy pytest

làm việc với terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Nguyên tắc Kỹ thuật Phần mềm với Python

Chạy pytest

làm việc với terminal

datacamp@server:~/work_dir $ pytest tests/test_document.py
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Nguyên tắc Kỹ thuật Phần mềm với Python

Bài kiểm thử thất bại

làm việc với terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py F.

============== FAILURES ==============
________ test_document_tokens ________

def test_document_tokens(): doc = Document('a e i o u')

assert doc.tokens == ['a', 'e', 'i', 'o']
E AssertionError: assert ['a', 'e', 'i', 'o', 'u'] == ['a', 'e', 'i', 'o']
E Left contains more items, first extra item: 'u'
E Use -v to get the full diff

tests/test_document.py:7: AssertionError
====== 1 failed in 0.57 seconds ======
Nguyên tắc Kỹ thuật Phần mềm với Python

Ayo berlatih!

Nguyên tắc Kỹ thuật Phần mềm với Python

Preparing Video For Download...