Hướng dẫn real python pytest - trăn pytest thực sự

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Kiểm tra mã của bạn với pytest This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Testing Your Code With pytest

Show

Kiểm tra mã của bạn mang lại nhiều lợi ích khác nhau. Nó làm tăng sự tự tin của bạn rằng mã hành xử như bạn mong đợi và đảm bảo rằng những thay đổi đối với mã của bạn đã giành được nguyên nhân gây ra hồi quy. Viết và duy trì các bài kiểm tra là công việc khó khăn, vì vậy bạn nên tận dụng tất cả các công cụ theo ý của bạn để làm cho nó không đau nhất có thể.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 là một trong những công cụ tốt nhất mà bạn có thể sử dụng để tăng năng suất thử nghiệm.

Trong hướng dẫn này, bạn sẽ học:

  • Những lợi ích nào
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 cung cấpbenefits
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 offers
  • Làm thế nào để đảm bảo các bài kiểm tra của bạn là không quốc tịchstateless
  • Cách thực hiện các bài kiểm tra lặp đi lặp lại dễ hiểu hơncomprehensible
  • Cách chạy tập hợp con của các bài kiểm tra theo tên hoặc nhóm tùy chỉnhsubsets of tests by name or custom groups
  • Cách tạo và duy trì các tiện ích thử nghiệm có thể tái sử dụngreusable testing utilities

Cách cài đặt # test_with_unittest.py from unittest import TestCase class TryTesting(TestCase): def test_always_passes(self): self.assertTrue(True) def test_always_fails(self): self.assertTrue(False) 4

Để làm theo cùng với một số ví dụ trong hướng dẫn này, bạn sẽ cần cài đặt

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4. Vì hầu hết các gói Python,
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có sẵn trên PYPI. Bạn có thể cài đặt nó trong môi trường ảo bằng cách sử dụng
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
9:

  • các cửa sổ
  • Linux + MacOS

PS> python -m venv venv
PS> .\venv\Scripts\activate
(venv) PS> python -m pip install pytest

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest

Lệnh

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 hiện sẽ có sẵn trong môi trường cài đặt của bạn.

Điều gì làm cho # test_with_unittest.py from unittest import TestCase class TryTesting(TestCase): def test_always_passes(self): self.assertTrue(True) def test_always_fails(self): self.assertTrue(False) 4 rất hữu ích?

Nếu bạn đã viết các bài kiểm tra đơn vị cho mã Python của bạn trước đó, thì bạn có thể đã sử dụng mô-đun

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 tích hợp của Python.
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 cung cấp một cơ sở vững chắc để xây dựng bộ thử nghiệm của bạn, nhưng nó có một vài thiếu sót.
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2
module.
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 provides a solid base on which to build your test suite, but it has a few shortcomings.

Một số khung thử nghiệm của bên thứ ba cố gắng giải quyết một số vấn đề với

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 và
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 đã được chứng minh là một trong những vấn đề phổ biến nhất.
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 là một hệ sinh thái dựa trên plugin giàu tính năng để kiểm tra mã Python của bạn.

Nếu bạn thiên đường có niềm vui khi sử dụng

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, thì bạn sẽ tham gia một điều trị! Triết lý và tính năng của nó sẽ làm cho trải nghiệm thử nghiệm của bạn hiệu quả và thú vị hơn. Với
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, các tác vụ phổ biến đòi hỏi ít mã hơn và các tác vụ nâng cao có thể đạt được thông qua một loạt các lệnh và plugin tiết kiệm thời gian. Nó thậm chí còn chạy các bài kiểm tra hiện tại của bạn ra khỏi hộp, bao gồm cả những bài được viết bằng
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2.

Như với hầu hết các khung, một số mô hình phát triển có ý nghĩa khi bạn bắt đầu sử dụng

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có thể bắt đầu gây đau khi bộ thử nghiệm của bạn phát triển. Hướng dẫn này sẽ giúp bạn hiểu một số công cụ
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp để giữ cho thử nghiệm của bạn hiệu quả và hiệu quả ngay cả khi nó mở rộng quy mô.

Ít nồi hơi ít hơn

Hầu hết các thử nghiệm chức năng đều tuân theo mô hình Act-act-Act-Act::

  1. Sắp xếp hoặc thiết lập các điều kiện để kiểm tra, or set up, the conditions for the test
  2. Hành động bằng cách gọi một số chức năng hoặc phương thức by calling some function or method
  3. Khẳng định rằng một số điều kiện kết thúc là đúng that some end condition is true

Các khung kiểm tra thường nối vào các xác nhận thử nghiệm của bạn để chúng có thể cung cấp thông tin khi xác nhận không thành công.

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2, ví dụ, cung cấp một số tiện ích khẳng định hữu ích ra khỏi hộp. Tuy nhiên, ngay cả một tập hợp nhỏ các thử nghiệm cũng yêu cầu một lượng mã nồi hơi hợp lý.

Hãy tưởng tượng bạn muốn viết một bộ thử nghiệm chỉ để đảm bảo rằng

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 đang hoạt động tốt trong dự án của bạn. Bạn có thể muốn viết một bài kiểm tra luôn vượt qua và một bài kiểm tra luôn thất bại:

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)

Sau đó, bạn có thể chạy các thử nghiệm đó từ dòng lệnh bằng tùy chọn

# test_with_pytest.py

def test_always_passes():
    assert True

def test_always_fails():
    assert False
4 là
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2:

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)

Đúng như dự đoán, một bài kiểm tra đã qua và một lần thất bại. Bạn đã chứng minh rằng

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 đang hoạt động, nhưng hãy nhìn vào những gì bạn phải làm:

  1. Nhập lớp
    # test_with_pytest.py
    
    def test_always_passes():
        assert True
    
    def test_always_fails():
        assert False
    
    7 từ
    (venv) $ python -m unittest discover
    F.
    ======================================================================
    FAIL: test_always_fails (test_with_unittest.TryTesting)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "...\effective-python-testing-with-pytest\test_with_unittest.py",
      line 10, in test_always_fails
        self.assertTrue(False)
    AssertionError: False is not true
    
    ----------------------------------------------------------------------
    
    Ran 2 tests in 0.006s
    
    FAILED (failures=1)
    
    2
  2. Tạo
    # test_with_pytest.py
    
    def test_always_passes():
        assert True
    
    def test_always_fails():
        assert False
    
    9, một lớp con của
    # test_with_pytest.py
    
    def test_always_passes():
        assert True
    
    def test_always_fails():
        assert False
    
    7
  3. Viết một phương thức trong
    # test_with_pytest.py
    
    def test_always_passes():
        assert True
    
    def test_always_fails():
        assert False
    
    9 cho mỗi bài kiểm tra
  4. Sử dụng một trong các phương thức
    (venv) $ pytest
    ============================= test session starts =============================
    platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
    rootdir: ...\effective-python-testing-with-pytest
    collected 4 items
    
    test_with_pytest.py .F                                                   [ 50%]
    test_with_unittest.py F.                                                 [100%]
    
    ================================== FAILURES ===================================
    ______________________________ test_always_fails ______________________________
    
        def test_always_fails():
    >       assert False
    E       assert False
    
    test_with_pytest.py:7: AssertionError
    ________________________ TryTesting.test_always_fails _________________________
    
    self = 
    
        def test_always_fails(self):
    >       self.assertTrue(False)
    E       AssertionError: False is not true
    
    test_with_unittest.py:10: AssertionError
    =========================== short test summary info ===========================
    FAILED test_with_pytest.py::test_always_fails - assert False
    FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...
    
    ========================= 2 failed, 2 passed in 0.20s =========================
    
    2 từ
    (venv) $ pytest
    ============================= test session starts =============================
    platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
    rootdir: ...\effective-python-testing-with-pytest
    collected 4 items
    
    test_with_pytest.py .F                                                   [ 50%]
    test_with_unittest.py F.                                                 [100%]
    
    ================================== FAILURES ===================================
    ______________________________ test_always_fails ______________________________
    
        def test_always_fails():
    >       assert False
    E       assert False
    
    test_with_pytest.py:7: AssertionError
    ________________________ TryTesting.test_always_fails _________________________
    
    self = 
    
        def test_always_fails(self):
    >       self.assertTrue(False)
    E       AssertionError: False is not true
    
    test_with_unittest.py:10: AssertionError
    =========================== short test summary info ===========================
    FAILED test_with_pytest.py::test_always_fails - assert False
    FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...
    
    ========================= 2 failed, 2 passed in 0.20s =========================
    
    3 để đưa ra các xác nhận

Đó là một lượng mã đáng kể để viết và bởi vì nó có mức tối thiểu bạn cần cho bất kỳ bài kiểm tra nào, bạn cuối cùng đã viết cùng một mã.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 Đơn giản hóa quy trình công việc này bằng cách cho phép bạn sử dụng các chức năng bình thường và từ khóa Python từ
(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
5 trực tiếp:

# test_with_pytest.py

def test_always_passes():
    assert True

def test_always_fails():
    assert False

Đó là nó. Bạn không phải đối phó với bất kỳ loại nhập khẩu hoặc lớp học nào. Tất cả những gì bạn cần làm là bao gồm một chức năng với tiền tố

(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
6. Bởi vì bạn có thể sử dụng từ khóa
(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
5, bạn cũng không cần phải học hoặc nhớ tất cả các phương thức
(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
2 khác nhau trong
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2. Nếu bạn có thể viết một biểu thức mà bạn mong đợi để đánh giá thành
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items
0, và sau đó
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 sẽ kiểm tra nó cho bạn.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 không chỉ loại bỏ rất nhiều nồi hơi, mà còn cung cấp cho bạn một đầu ra chi tiết và dễ đọc hơn nhiều.

Đầu ra đẹp hơn

Bạn có thể chạy bộ thử nghiệm của mình bằng lệnh

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 từ thư mục cấp cao nhất trong dự án của bạn:

(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 trình bày kết quả kiểm tra khác với
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 và tệp
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items
6 cũng tự động được bao gồm. Báo cáo cho thấy:

  1. Trạng thái hệ thống, bao gồm các phiên bản của Python,
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 và bất kỳ plugin nào bạn đã cài đặt
  2. ============================= test session starts =============================
    platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
    rootdir: ...\effective-python-testing-with-pytest
    collected 4 items
    
    8 hoặc thư mục để tìm kiếm theo cấu hình và kiểm tra
  3. Số lượng bài kiểm tra mà người chạy đã phát hiện

Các mục này được trình bày trong phần đầu tiên của đầu ra:

============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

Đầu ra sau đó chỉ ra trạng thái của mỗi thử nghiệm bằng cách sử dụng cú pháp tương tự như

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2:

  • Một dấu chấm (
    test_with_pytest.py .F                                                   [ 50%]
    test_with_unittest.py F.                                                 [100%]
    
    0) có nghĩa là bài kiểm tra đã qua.
    means that the test passed.
  • Một
    test_with_pytest.py .F                                                   [ 50%]
    test_with_unittest.py F.                                                 [100%]
    
    1 có nghĩa là thử nghiệm đã thất bại.
    means that the test has failed.
  • Một
    test_with_pytest.py .F                                                   [ 50%]
    test_with_unittest.py F.                                                 [100%]
    
    2 có nghĩa là bài kiểm tra đã đưa ra một ngoại lệ bất ngờ.
    means that the test raised an unexpected exception.

Các ký tự đặc biệt được hiển thị bên cạnh tên với tiến trình tổng thể của bộ thử nghiệm được hiển thị bên phải:

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

Đối với các thử nghiệm thất bại, báo cáo đưa ra một sự cố chi tiết về sự thất bại. Trong ví dụ, các thử nghiệm không thành công vì

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]
3 luôn thất bại:

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError

Đầu ra bổ sung này có thể cực kỳ tiện dụng khi gỡ lỗi. Cuối cùng, báo cáo đưa ra một báo cáo trạng thái tổng thể của bộ thử nghiệm:

=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================

Khi so sánh với Unittest, đầu ra

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có nhiều thông tin và dễ đọc hơn nhiều.

Trong phần tiếp theo, bạn sẽ xem xét kỹ hơn về cách

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 tận dụng từ khóa
(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
5 hiện có.

Ít học hỏi hơn

Có thể sử dụng từ khóa

(venv) $ pytest
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: ...\effective-python-testing-with-pytest
collected 4 items

test_with_pytest.py .F                                                   [ 50%]
test_with_unittest.py F.                                                 [100%]

================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
=========================== short test summary info ===========================
FAILED test_with_pytest.py::test_always_fails - assert False
FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...

========================= 2 failed, 2 passed in 0.20s =========================
5 cũng mạnh mẽ. Nếu bạn đã sử dụng nó trước đây, thì không có gì mới để học. Dưới đây là một vài ví dụ khẳng định để bạn có thể có ý tưởng về các loại thử nghiệm bạn có thể thực hiện:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
0

Chúng trông rất giống các chức năng Python bình thường. Tất cả những điều này làm cho đường cong học tập cho

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 nông hơn so với
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 vì bạn không cần phải học các cấu trúc mới để bắt đầu.

Lưu ý rằng mỗi bài kiểm tra là khá nhỏ và khép kín. Điều này là phổ biến, bạn sẽ thấy các tên chức năng dài và không có nhiều thứ đang diễn ra trong một hàm. Điều này phục vụ chủ yếu để giữ cho các bài kiểm tra của bạn bị cô lập với nhau, vì vậy nếu một cái gì đó bị phá vỡ, bạn sẽ biết chính xác vấn đề ở đâu. Một tác dụng phụ tốt đẹp là việc ghi nhãn tốt hơn nhiều trong đầu ra.

Để xem một ví dụ về một dự án tạo ra một bộ thử nghiệm cùng với dự án chính, hãy xem bảng băm xây dựng trong Python với hướng dẫn TDD. Ngoài ra, bạn có thể làm việc với các vấn đề thực hành Python để thử phát triển theo hướng thử nghiệm trong khi bạn sẵn sàng cho các tệp cuộc phỏng vấn tiếp theo hoặc phân tích CSV.

Trong phần tiếp theo, bạn sẽ được kiểm tra đồ đạc, một tính năng tuyệt vời nhất để giúp bạn quản lý các giá trị đầu vào kiểm tra.

Dễ dàng hơn để quản lý trạng thái và phụ thuộc

Các bài kiểm tra của bạn thường sẽ phụ thuộc vào các loại dữ liệu hoặc kiểm tra nhân đôi mà giả mã mã của bạn có thể gặp phải, chẳng hạn như từ điển hoặc tệp JSON.

Với

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2, bạn có thể trích xuất các phụ thuộc này vào các phương pháp
================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
1 và
================================== FAILURES ===================================
______________________________ test_always_fails ______________________________

    def test_always_fails():
>       assert False
E       assert False

test_with_pytest.py:7: AssertionError
________________________ TryTesting.test_always_fails _________________________

self = 

    def test_always_fails(self):
>       self.assertTrue(False)
E       AssertionError: False is not true

test_with_unittest.py:10: AssertionError
2 để mỗi thử nghiệm trong lớp có thể sử dụng chúng. Sử dụng các phương pháp đặc biệt này là tốt, nhưng khi các lớp kiểm tra của bạn lớn hơn, bạn có thể vô tình làm cho sự phụ thuộc của bài kiểm tra hoàn toàn tiềm ẩn. Nói cách khác, bằng cách nhìn vào một trong nhiều xét nghiệm trong sự cô lập, bạn có thể không thấy ngay rằng nó phụ thuộc vào một cái gì đó khác.implicit. In other words, by looking at one of the many tests in isolation, you may not immediately see that it depends on something else.

Theo thời gian, các phụ thuộc ngầm có thể dẫn đến một mớ mã phức tạp mà bạn phải thư giãn để hiểu được các bài kiểm tra của mình. Các bài kiểm tra sẽ giúp làm cho mã của bạn dễ hiểu hơn. Nếu các bài kiểm tra rất khó hiểu, thì bạn có thể gặp rắc rối!

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có một cách tiếp cận khác. Nó dẫn bạn đến các tuyên bố phụ thuộc rõ ràng vẫn có thể tái sử dụng nhờ sự sẵn có của đồ đạc.
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 đồ đạc là các hàm có thể tạo dữ liệu, kiểm tra nhân đôi hoặc khởi tạo trạng thái hệ thống cho bộ thử nghiệm. Bất kỳ thử nghiệm nào muốn sử dụng một vật cố định phải sử dụng rõ ràng chức năng vật cố này làm đối số cho chức năng thử nghiệm, vì vậy các phụ thuộc luôn được nêu lên phía trước:explicit dependency declarations that are still reusable thanks to the availability of fixtures.
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 fixtures are functions that can create data, test doubles, or initialize system state for the test suite. Any test that wants to use a fixture must explicitly use this fixture function as an argument to the test function, so dependencies are always stated up front:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
1

Nhìn vào chức năng kiểm tra, bạn có thể ngay lập tức biết rằng nó phụ thuộc vào một vật cố, mà không cần kiểm tra toàn bộ tệp cho các định nghĩa cố định.

Đồ đạc cũng có thể sử dụng các đồ đạc khác, một lần nữa bằng cách tuyên bố chúng một cách rõ ràng là phụ thuộc. Điều đó có nghĩa là, theo thời gian, đồ đạc của bạn có thể trở nên cồng kềnh và mô -đun. Mặc dù khả năng chèn đồ đạc vào các đồ đạc khác mang lại sự linh hoạt to lớn, nhưng nó cũng có thể khiến việc quản lý các phụ thuộc trở nên khó khăn hơn khi bộ thử nghiệm của bạn phát triển.

Sau đó trong hướng dẫn này, bạn sẽ tìm hiểu thêm về đồ đạc và thử một vài kỹ thuật để xử lý các thử thách này.

Dễ dàng lọc các bài kiểm tra

Khi bộ thử nghiệm của bạn phát triển, bạn có thể thấy rằng bạn muốn chạy chỉ một vài thử nghiệm trên một tính năng và lưu bộ bộ đầy đủ cho sau này.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp một vài cách để làm điều này:

  • Lọc dựa trên tên: Bạn có thể giới hạn
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 chỉ để chạy những bài kiểm tra có tên đủ điều kiện phù hợp với một biểu thức cụ thể. Bạn có thể làm điều này với tham số
    ================================== FAILURES ===================================
    ______________________________ test_always_fails ______________________________
    
        def test_always_fails():
    >       assert False
    E       assert False
    
    test_with_pytest.py:7: AssertionError
    ________________________ TryTesting.test_always_fails _________________________
    
    self = 
    
        def test_always_fails(self):
    >       self.assertTrue(False)
    E       AssertionError: False is not true
    
    test_with_unittest.py:10: AssertionError
    
    7.
    : You can limit
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 to running only those tests whose fully qualified names match a particular expression. You can do this with the
    ================================== FAILURES ===================================
    ______________________________ test_always_fails ______________________________
    
        def test_always_fails():
    >       assert False
    E       assert False
    
    test_with_pytest.py:7: AssertionError
    ________________________ TryTesting.test_always_fails _________________________
    
    self = 
    
        def test_always_fails(self):
    >       self.assertTrue(False)
    E       AssertionError: False is not true
    
    test_with_unittest.py:10: AssertionError
    
    7 parameter.
  • Phạm vi thư mục: Theo mặc định,
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 sẽ chỉ chạy các thử nghiệm trong hoặc theo thư mục hiện tại.
    : By default,
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 will run only those tests that are in or under the current directory.
  • Phân loại thử nghiệm:
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 có thể bao gồm hoặc loại trừ các thử nghiệm khỏi các danh mục cụ thể mà bạn xác định. Bạn có thể làm điều này với tham số
    =========================== short test summary info ===========================
    FAILED test_with_pytest.py::test_always_fails - assert False
    FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...
    
    ========================= 2 failed, 2 passed in 0.20s =========================
    
    0.
    :
    # test_with_unittest.py
    
    from unittest import TestCase
    
    class TryTesting(TestCase):
        def test_always_passes(self):
            self.assertTrue(True)
    
        def test_always_fails(self):
            self.assertTrue(False)
    
    4 can include or exclude tests from particular categories that you define. You can do this with the
    =========================== short test summary info ===========================
    FAILED test_with_pytest.py::test_always_fails - assert False
    FAILED test_with_unittest.py::TryTesting::test_always_fails - AssertionError:...
    
    ========================= 2 failed, 2 passed in 0.20s =========================
    
    0 parameter.

Phân loại thử nghiệm nói riêng là một công cụ mạnh mẽ một cách tinh tế.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cho phép bạn tạo nhãn hiệu hoặc nhãn tùy chỉnh, cho bất kỳ bài kiểm tra nào bạn thích. Một bài kiểm tra có thể có nhiều nhãn và bạn có thể sử dụng chúng để kiểm soát hạt trên các thử nghiệm nào để chạy. Sau đó trong hướng dẫn này, bạn sẽ thấy một ví dụ về cách
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 đánh dấu hoạt động và học cách sử dụng chúng trong một bộ thử nghiệm lớn.marks, or custom labels, for any test you like. A test may have multiple labels, and you can use them for granular control over which tests to run. Later in this tutorial, you’ll see an example of how
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 marks work and learn how to make use of them in a large test suite.

Cho phép tham số kiểm tra

Khi bạn kiểm tra các chức năng xử lý dữ liệu hoặc thực hiện các phép biến đổi chung, bạn sẽ thấy mình viết nhiều bài kiểm tra tương tự. Chúng chỉ có thể khác nhau trong đầu vào hoặc đầu ra của mã được kiểm tra. Điều này đòi hỏi phải sao chép mã kiểm tra và đôi khi làm như vậy có thể che khuất hành vi mà bạn đang cố gắng kiểm tra.

(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 cung cấp một cách thu thập một số bài kiểm tra thành một, nhưng chúng không thể hiển thị như các bài kiểm tra riêng lẻ trong các báo cáo kết quả. Nếu một bài kiểm tra thất bại và phần còn lại vượt qua, thì toàn bộ nhóm vẫn sẽ trả về một kết quả thất bại duy nhất.
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp giải pháp riêng trong đó mỗi bài kiểm tra có thể vượt qua hoặc thất bại độc lập. Bạn sẽ thấy cách tham số các bài kiểm tra với
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 sau trong hướng dẫn này.

Có kiến ​​trúc dựa trên plugin

Một trong những tính năng đẹp nhất của

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 là sự cởi mở của nó đối với tùy chỉnh và các tính năng mới. Hầu như mọi phần của chương trình có thể bị phá vỡ và thay đổi. Do đó, người dùng
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 đã phát triển một hệ sinh thái phong phú về các plugin hữu ích.

Mặc dù một số plugin

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 tập trung vào các khung cụ thể như Django, một số khác được áp dụng cho hầu hết các bộ thử nghiệm. Bạn sẽ thấy chi tiết về một số plugin cụ thể sau này trong hướng dẫn này.

Đồ đạc: Quản lý trạng thái và phụ thuộc

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 đồ đạc là một cách cung cấp dữ liệu, kiểm tra nhân đôi hoặc thiết lập trạng thái cho các bài kiểm tra của bạn. Đồ đạc là các hàm có thể trả về một loạt các giá trị. Mỗi bài kiểm tra phụ thuộc vào một vật cố định phải chấp nhận rõ ràng đó đó là một đối số.

Khi nào nên tạo đồ đạc

Trong phần này, bạn sẽ mô phỏng quy trình công việc phát triển theo hướng thử nghiệm điển hình (TDD).

Hãy tưởng tượng bạn đang viết một hàm,

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
00, để xử lý dữ liệu được trả về bởi điểm cuối API. Dữ liệu đại diện cho một danh sách những người, mỗi người có một tên, tên gia đình và tiêu đề công việc nhất định. Chức năng sẽ xuất ra một danh sách các chuỗi bao gồm mỗi người tên đầy đủ (
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
01 của họ theo sau là
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
02 của họ), một dấu hai chấm và
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
03 của họ:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
2

Trong thời trang TDD tốt, trước tiên bạn muốn viết một bài kiểm tra cho nó. Bạn có thể viết mã sau đây cho điều đó:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
3

Trong khi viết bài kiểm tra này, điều đó xảy ra với bạn rằng bạn có thể cần phải viết một chức năng khác để chuyển đổi dữ liệu thành các giá trị được phân tách bằng dấu phẩy để sử dụng trong Excel:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
4

Danh sách việc cần làm của bạn tăng lên! Tốt đấy! Một trong những lợi thế của TDD là nó giúp bạn lên kế hoạch cho công việc phía trước. Bài kiểm tra cho hàm

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
04 sẽ trông cực kỳ giống với hàm
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
00:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
5

Đáng chú ý, cả hai thử nghiệm phải lặp lại định nghĩa của biến

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
06, đó là khá nhiều dòng mã.

Nếu bạn thấy mình viết một số bài kiểm tra mà tất cả đều sử dụng cùng một dữ liệu thử nghiệm cơ bản, thì một trận đấu có thể có trong tương lai của bạn. Bạn có thể kéo dữ liệu lặp lại vào một hàm duy nhất được trang trí bằng

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
07 để chỉ ra rằng hàm là vật cố
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
6

Bạn có thể sử dụng vật cố bằng cách thêm tham chiếu chức năng làm đối số vào các bài kiểm tra của bạn. Lưu ý rằng bạn không gọi chức năng cố định.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 chăm sóc điều đó. Bạn có thể sử dụng giá trị trả về của hàm vật cố làm tên của hàm cố định:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
7

Mỗi bài kiểm tra bây giờ đáng chú ý ngắn hơn nhưng vẫn có một đường dẫn rõ ràng trở lại dữ liệu mà nó phụ thuộc vào. Hãy chắc chắn đặt tên cho trận đấu của bạn một cái gì đó cụ thể. Bằng cách đó, bạn có thể nhanh chóng xác định xem bạn có muốn sử dụng nó khi viết các bài kiểm tra mới trong tương lai không!

Khi bạn lần đầu tiên khám phá sức mạnh của đồ đạc, có thể rất hấp dẫn khi sử dụng chúng mọi lúc, nhưng như với tất cả mọi thứ, có một sự cân bằng được duy trì.

Khi nào nên tránh đồ đạc

Đồ đạc là tuyệt vời để trích xuất dữ liệu hoặc các đối tượng mà bạn sử dụng trên nhiều thử nghiệm. Tuy nhiên, chúng luôn luôn tốt cho các bài kiểm tra đòi hỏi các biến thể nhỏ trong dữ liệu. Xử lý bộ thử nghiệm của bạn với đồ đạc không tốt hơn việc xả rác với dữ liệu hoặc đối tượng đơn giản. Nó thậm chí có thể tồi tệ hơn vì lớp bổ sung được thêm vào.

Như với hầu hết các trừu tượng, nó cần một số thực hành và suy nghĩ để tìm đúng mức độ sử dụng vật cố định.

Tuy nhiên, đồ đạc có thể sẽ là một phần không thể thiếu trong bộ thử nghiệm của bạn. Khi dự án của bạn phát triển trong phạm vi, thách thức của quy mô bắt đầu đi vào bức tranh. Một trong những thách thức mà bất kỳ loại công cụ nào phải đối mặt là cách nó xử lý được sử dụng ở quy mô, và may mắn thay,

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có một loạt các tính năng hữu ích có thể giúp bạn quản lý sự phức tạp đi kèm với sự tăng trưởng.

Cách sử dụng đồ đạc ở quy mô

Khi bạn trích xuất nhiều đồ đạc từ các bài kiểm tra của mình, bạn có thể thấy rằng một số đồ đạc có thể được hưởng lợi từ sự trừu tượng hơn nữa. Trong

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, đồ đạc là mô -đun. Là mô -đun có nghĩa là đồ đạc có thể được nhập, có thể nhập các mô -đun khác và chúng có thể phụ thuộc và nhập các đồ đạc khác. Tất cả điều này cho phép bạn soạn một bản tóm tắt đồ đạc phù hợp cho trường hợp sử dụng của bạn.modular. Being modular means that fixtures can be imported, can import other modules, and they can depend on and import other fixtures. All this allows you to compose a suitable fixture abstraction for your use case.

Ví dụ: bạn có thể thấy rằng đồ đạc trong hai tệp hoặc mô -đun riêng biệt, chia sẻ một phụ thuộc chung. Trong trường hợp này, bạn có thể di chuyển đồ đạc từ các mô-đun thử nghiệm sang các mô-đun liên quan đến cố định chung hơn. Bằng cách đó, bạn có thể nhập chúng trở lại vào bất kỳ mô -đun thử nghiệm nào cần chúng. Đây là một cách tiếp cận tốt khi bạn thấy mình sử dụng một trận đấu nhiều lần trong suốt dự án của mình.

Nếu bạn muốn cung cấp một trận đấu cho toàn bộ dự án của mình mà không cần phải nhập, một mô -đun cấu hình đặc biệt có tên

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
12 sẽ cho phép bạn làm điều đó.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 tìm kiếm một mô -đun
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
12 trong mỗi thư mục. Nếu bạn thêm đồ đạc có mục đích chung của mình vào mô-đun
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
12, thì bạn sẽ có thể sử dụng vật cố đó trong suốt thư mục cha mẹ mô-đun và trong bất kỳ thư mục con nào mà không phải nhập. Đây là một nơi tuyệt vời để đặt đồ đạc được sử dụng rộng rãi nhất của bạn.

Một trường hợp sử dụng thú vị khác cho đồ đạc và

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
12 là bảo vệ quyền truy cập vào tài nguyên. Hãy tưởng tượng rằng bạn đã viết một bộ kiểm tra cho mã liên quan đến các cuộc gọi API. Bạn muốn đảm bảo rằng bộ thử nghiệm không thực hiện bất kỳ cuộc gọi mạng thực sự nào ngay cả khi ai đó vô tình viết một bài kiểm tra làm như vậy.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp một vật cố
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
18 để thay thế các giá trị và hành vi mà bạn có thể sử dụng để có hiệu quả tuyệt vời:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
8

Bằng cách đặt

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
19 trong
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
12 và thêm tùy chọn
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
21, bạn đảm bảo rằng các cuộc gọi mạng sẽ bị tắt trong mọi thử nghiệm trên bộ. Bất kỳ thử nghiệm nào thực thi mã gọi mã
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
22 sẽ tăng
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
23 chỉ ra rằng một cuộc gọi mạng bất ngờ sẽ xảy ra.

Bộ thử nghiệm của bạn đang phát triển về số lượng, điều này mang lại cho bạn cảm giác tự tin tuyệt vời để thay đổi và không phá vỡ mọi thứ một cách bất ngờ. Điều đó nói rằng, khi bộ thử nghiệm của bạn phát triển, nó có thể bắt đầu mất nhiều thời gian. Ngay cả khi nó không mất nhiều thời gian, có lẽ bạn đang tập trung vào một số hành vi cốt lõi chùn bước và phá vỡ hầu hết các bài kiểm tra. Trong những trường hợp này, bạn có thể muốn giới hạn người chạy thử chỉ ở một loại thử nghiệm nhất định.

Dấu: Phân loại các bài kiểm tra

Trong bất kỳ bộ thử nghiệm lớn nào, thật tuyệt khi tránh chạy tất cả các bài kiểm tra khi bạn đang cố gắng lặp lại một cách nhanh chóng trên một tính năng mới. Ngoài hành vi mặc định của

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 để chạy tất cả các thử nghiệm trong thư mục làm việc hiện tại hoặc chức năng lọc, bạn có thể tận dụng các điểm đánh dấu.markers.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cho phép bạn xác định các danh mục cho các bài kiểm tra của mình và cung cấp các tùy chọn để bao gồm hoặc loại trừ các danh mục khi bạn chạy bộ của mình. Bạn có thể đánh dấu một bài kiểm tra với bất kỳ số lượng danh mục.

Các bài kiểm tra đánh dấu là hữu ích để phân loại các bài kiểm tra theo hệ thống con hoặc phụ thuộc. Ví dụ, nếu một số thử nghiệm của bạn yêu cầu truy cập vào cơ sở dữ liệu, thì bạn có thể tạo dấu

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
26 cho chúng.

Khi thời gian đến để chạy các bài kiểm tra của bạn, bạn vẫn có thể chạy tất cả chúng theo mặc định với lệnh

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4. Nếu bạn muốn chỉ chạy các thử nghiệm yêu cầu truy cập cơ sở dữ liệu, thì bạn có thể sử dụng
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
28. Để chạy tất cả các thử nghiệm ngoại trừ các bài kiểm tra yêu cầu truy cập cơ sở dữ liệu, bạn có thể sử dụng
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
29. Bạn thậm chí có thể sử dụng vật cố
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
30 để giới hạn quyền truy cập cơ sở dữ liệu vào các thử nghiệm được đánh dấu bằng
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
31.

Một số plugin mở rộng về chức năng của nhãn hiệu bằng cách thêm người bảo vệ của riêng họ. Chẳng hạn, plugin

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
32 cung cấp nhãn
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
33. Bất kỳ thử nghiệm nào mà không có dấu hiệu này cố gắng truy cập cơ sở dữ liệu sẽ thất bại. Thử nghiệm đầu tiên cố gắng truy cập cơ sở dữ liệu sẽ kích hoạt việc tạo cơ sở dữ liệu thử nghiệm Django.

Yêu cầu mà bạn thêm mark

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
33 ảnh hưởng rõ ràng đến việc nêu rõ các phụ thuộc của bạn. Rốt cuộc, đó là triết lý ____24! Điều đó cũng có nghĩa là bạn có thể nhanh chóng chạy các bài kiểm tra mà không dựa vào cơ sở dữ liệu, bởi vì
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
36 sẽ ngăn thử nghiệm kích hoạt việc tạo cơ sở dữ liệu. Tiết kiệm thời gian thực sự cộng lại, đặc biệt là nếu bạn thường xuyên chạy các bài kiểm tra của mình.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp một vài điểm ra khỏi hộp:

  • $ python -m venv venv
    $ source venv/bin/activate
    (venv) $ python -m pip install pytest
    
    38 bỏ qua một bài kiểm tra vô điều kiện.
    skips a test unconditionally.
  • $ python -m venv venv
    $ source venv/bin/activate
    (venv) $ python -m pip install pytest
    
    39 bỏ qua một bài kiểm tra nếu biểu thức được truyền cho nó đánh giá thành
    ============================= test session starts =============================
    platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
    rootdir: ...\effective-python-testing-with-pytest
    collected 4 items
    
    0.
    skips a test if the expression passed to it evaluates to
    ============================= test session starts =============================
    platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
    rootdir: ...\effective-python-testing-with-pytest
    collected 4 items
    
    0.
  • $ python -m venv venv
    $ source venv/bin/activate
    (venv) $ python -m pip install pytest
    
    41 chỉ ra rằng một thử nghiệm dự kiến ​​sẽ thất bại, vì vậy nếu thử nghiệm không thành công, bộ tổng thể vẫn có thể dẫn đến trạng thái vượt qua.
    indicates that a test is expected to fail, so if the test does fail, the overall suite can still result in a passing status.
  • $ python -m venv venv
    $ source venv/bin/activate
    (venv) $ python -m pip install pytest
    
    42 tạo ra nhiều biến thể của một thử nghiệm với các giá trị khác nhau làm đối số. Bạn sẽ tìm hiểu thêm về dấu hiệu này trong thời gian ngắn.
    creates multiple variants of a test with different values as arguments. You’ll learn more about this mark shortly.

Bạn có thể thấy một danh sách tất cả các nhãn hiệu mà

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 biết về bằng cách chạy
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
44.

Về chủ đề của tham số hóa, điều đó sẽ xuất hiện tiếp theo.

Tham số: Kết hợp các bài kiểm tra

Bạn đã thấy trước đó trong hướng dẫn này làm thế nào các đồ đạc

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có thể được sử dụng để giảm sự trùng lặp mã bằng cách trích xuất các phụ thuộc chung. Đồ đạc không phải là hữu ích khi bạn có một số thử nghiệm với các đầu vào hơi khác nhau và đầu ra dự kiến. Trong các trường hợp này, bạn có thể tham số một định nghĩa thử nghiệm duy nhất và
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 sẽ tạo các biến thể của bài kiểm tra cho bạn với các tham số bạn chỉ định.parametrize a single test definition, and
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 will create variants of the test for you with the parameters you specify.

Hãy tưởng tượng bạn đã viết một chức năng để nói nếu một chuỗi là một palindrom. Một tập hợp các bài kiểm tra ban đầu có thể trông như thế này:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
9

Tất cả các thử nghiệm này ngoại trừ hai bài kiểm tra cuối cùng có hình dạng giống nhau:

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
0

Điều này đang bắt đầu có mùi rất giống như nồi hơi.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cho đến nay đã giúp bạn thoát khỏi nồi hơi, và nó không phải là để bạn thất vọng ngay bây giờ. Bạn có thể sử dụng
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
48 để điền vào hình dạng này với các giá trị khác nhau, giảm đáng kể mã kiểm tra của bạn:

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
1

Đối số đầu tiên của

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
49 là một chuỗi các tên tham số được phân phối bằng dấu phẩy. Bạn không cần phải cung cấp nhiều hơn một tên, như bạn có thể thấy trong ví dụ này. Đối số thứ hai là danh sách các bộ dữ liệu hoặc giá trị đơn thể hiện (các) giá trị tham số. Bạn có thể đưa tham số của mình một bước nữa để kết hợp tất cả các bài kiểm tra của mình thành một:

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
2

Mặc dù điều này đã rút ngắn mã của bạn, nhưng điều quan trọng cần lưu ý là trong trường hợp này, bạn thực sự đã mất một số tính chất mô tả hơn của các chức năng ban đầu. Hãy chắc chắn rằng bạn không tham gia bộ thử nghiệm của bạn thành sự khó hiểu. Bạn có thể sử dụng tham số để tách dữ liệu kiểm tra khỏi hành vi kiểm tra để nó rõ ràng những gì bài kiểm tra đang kiểm tra và cũng để làm cho các trường hợp kiểm tra khác nhau dễ đọc và bảo trì hơn.

Báo cáo về thời lượng: Chống lại các bài kiểm tra chậm

Mỗi lần bạn chuyển bối cảnh từ mã thực hiện sang mã kiểm tra, bạn phải chịu một số chi phí. Nếu các bài kiểm tra của bạn chậm bắt đầu, thì chi phí có thể gây ra ma sát và thất vọng.

Bạn đã đọc trước đó về việc sử dụng nhãn hiệu để lọc các bài kiểm tra chậm khi bạn chạy bộ của mình, nhưng đến một lúc nào đó, bạn sẽ cần phải chạy chúng. Nếu bạn muốn cải thiện tốc độ của các bài kiểm tra của mình, thì nó rất hữu ích khi biết những bài kiểm tra nào có thể cung cấp những cải tiến lớn nhất.

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có thể tự động ghi lại thời lượng kiểm tra cho bạn và báo cáo những người phạm tội hàng đầu.

Sử dụng tùy chọn

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
51 cho lệnh
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 để bao gồm báo cáo thời lượng trong kết quả kiểm tra của bạn.
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
51 mong đợi một giá trị số nguyên
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
54 và sẽ báo cáo số lượng kiểm tra
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
54 chậm nhất. Một phần mới sẽ được bao gồm trong báo cáo thử nghiệm của bạn:

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
3

Mỗi bài kiểm tra hiển thị trong báo cáo thời lượng là một ứng cử viên tốt để tăng tốc vì phải mất một lượng trên trung bình trong tổng thời gian thử nghiệm. Lưu ý rằng thời lượng ngắn được ẩn theo mặc định. Như được đánh vần trong báo cáo, bạn có thể tăng tính xác suất báo cáo và hiển thị những điều này bằng cách vượt qua

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
56 cùng với
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
51.

Xin lưu ý rằng một số thử nghiệm có thể có chi phí thiết lập vô hình. Bạn đã đọc trước đó về cách thử nghiệm đầu tiên được đánh dấu bằng

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
33 sẽ kích hoạt việc tạo cơ sở dữ liệu thử nghiệm Django. Báo cáo
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
59 phản ánh thời gian cần thiết để thiết lập cơ sở dữ liệu trong thử nghiệm kích hoạt việc tạo cơ sở dữ liệu, có thể gây hiểu lầm.

Bạn có thể trên đường đến bảo hiểm thử nghiệm đầy đủ. Tiếp theo, bạn sẽ xem xét một số plugin là một phần của hệ sinh thái plugin

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 phong phú.

Plugin # test_with_unittest.py from unittest import TestCase class TryTesting(TestCase): def test_always_passes(self): self.assertTrue(True) def test_always_fails(self): self.assertTrue(False) 4 hữu ích

Bạn đã tìm hiểu về một vài plugin

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có giá trị trước đó trong hướng dẫn này. Trong phần này, bạn sẽ khám phá những điều đó và một vài người khác ở độ sâu hơn mọi thứ từ các plugin tiện ích như
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
63 đến các plugin dành riêng cho thư viện, như các plugin cho Django.

$ python -m venv venv $ source venv/bin/activate (venv) $ python -m pip install pytest 63

Thông thường thứ tự các bài kiểm tra của bạn là không quan trọng, nhưng khi cơ sở mã của bạn phát triển, bạn có thể vô tình giới thiệu một số tác dụng phụ có thể khiến một số thử nghiệm thất bại nếu chúng bị hết thứ tự.

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
63 buộc các bài kiểm tra của bạn phải chạy theo thứ tự ngẫu nhiên.
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 luôn thu thập tất cả các bài kiểm tra mà nó có thể tìm thấy trước khi chạy chúng.
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
63 Chỉ cần xáo trộn danh sách các bài kiểm tra trước khi thực hiện.

Đây là một cách tuyệt vời để khám phá các bài kiểm tra phụ thuộc vào việc chạy theo một thứ tự cụ thể, điều đó có nghĩa là họ có một sự phụ thuộc trạng thái vào một số thử nghiệm khác. Nếu bạn đã xây dựng bộ thử nghiệm của mình từ đầu trong

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, thì đây không phải là rất có thể. Nó có nhiều khả năng xảy ra trong các bộ thử nghiệm mà bạn di chuyển sang
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4.stateful dependency on some other test. If you built your test suite from scratch in
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, then this isn’t very likely. It’s more likely to happen in test suites that you migrate to
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4.

Plugin sẽ in một giá trị hạt giống trong mô tả cấu hình. Bạn có thể sử dụng giá trị đó để chạy các bài kiểm tra theo cùng thứ tự khi bạn cố gắng khắc phục sự cố.

$ python -m venv venv $ source venv/bin/activate (venv) $ python -m pip install pytest 70

Nếu bạn muốn đo lường mức độ kiểm tra của bạn bao gồm mã triển khai của bạn, thì bạn có thể sử dụng gói bảo hiểm.

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
70 Tích hợp phạm vi bảo hiểm, vì vậy bạn có thể chạy
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
72 để xem báo cáo bảo hiểm thử nghiệm và tự hào về nó trên trang nhất dự án của bạn.

$ python -m venv venv $ source venv/bin/activate (venv) $ python -m pip install pytest 32

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
32 cung cấp một số ít đồ đạc và nhãn hiệu hữu ích để xử lý các bài kiểm tra Django. Bạn đã thấy mốc
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
33 trước đó trong hướng dẫn này. Lịch trình
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
76 cung cấp quyền truy cập trực tiếp vào một thể hiện của Django,
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
77. Lịch trình
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pytest
78 cung cấp một cách nhanh chóng để đặt hoặc ghi đè cài đặt Django. Những plugin này là một sự thúc đẩy tuyệt vời cho năng suất thử nghiệm Django của bạn!

Nếu bạn quan tâm đến việc tìm hiểu thêm về việc sử dụng

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 với Django, thì hãy xem cách cung cấp đồ đạc thử nghiệm cho các mô hình Django trong pytest.

$ python -m venv venv $ source venv/bin/activate (venv) $ python -m pip install pytest 80

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có thể được sử dụng để chạy các thử nghiệm nằm ngoài phạm vi thử nghiệm đơn vị truyền thống. Phát triển theo hành vi (BDD) khuyến khích viết các mô tả ngôn ngữ đơn giản về các hành động và kỳ vọng của người dùng, sau đó bạn có thể sử dụng để xác định xem có nên thực hiện một tính năng nhất định hay không. Pytest-BDD giúp bạn sử dụng Gherkin để viết các bài kiểm tra tính năng cho mã của bạn.

Bạn có thể thấy những plugin khác có sẵn cho

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 với danh sách rộng rãi các plugin của bên thứ ba này.

Sự kết luận

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 cung cấp một bộ các tính năng năng suất cốt lõi để lọc và tối ưu hóa các thử nghiệm của bạn cùng với hệ thống plugin linh hoạt giúp mở rộng giá trị của nó hơn nữa. Cho dù bạn có một bộ kế thừa khổng lồ
(venv) $ python -m unittest discover
F.
======================================================================
FAIL: test_always_fails (test_with_unittest.TryTesting)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "...\effective-python-testing-with-pytest\test_with_unittest.py",
  line 10, in test_always_fails
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------

Ran 2 tests in 0.006s

FAILED (failures=1)
2 hay bạn đang bắt đầu một dự án mới từ đầu,
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 có một cái gì đó để cung cấp cho bạn.

Trong hướng dẫn này, bạn đã học cách sử dụng:

  • Đồ đạc để xử lý các phụ thuộc kiểm tra, trạng thái và chức năng có thể tái sử dụng for handling test dependencies, state, and reusable functionality
  • Dấu để phân loại các bài kiểm tra và giới hạn quyền truy cập vào các tài nguyên bên ngoài for categorizing tests and limiting access to external resources
  • Tham số để giảm mã trùng lặp giữa các bài kiểm tra for reducing duplicated code between tests
  • Thời lượng để xác định các bài kiểm tra chậm nhất của bạn to identify your slowest tests
  • Các plugin để tích hợp với các khung và công cụ kiểm tra khác for integrating with other frameworks and testing tools

Cài đặt

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4 và thử. Bạn sẽ vui vì bạn đã làm. Thử nghiệm vui vẻ!

Nếu bạn đang tìm kiếm một dự án ví dụ được xây dựng với

# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, thì hãy xem hướng dẫn về việc xây dựng bảng băm với TDD, điều này sẽ không chỉ giúp bạn tăng tốc với
# test_with_unittest.py

from unittest import TestCase

class TryTesting(TestCase):
    def test_always_passes(self):
        self.assertTrue(True)

    def test_always_fails(self):
        self.assertTrue(False)
4, mà còn giúp bạn làm chủ bảng băm!

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Kiểm tra mã của bạn với pytest This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Testing Your Code With pytest