Hướng dẫn Pytest cho người mới bắt đầu: Đồ đạc, tham số hóa và ví dụ thực tế

  1. Trang chủ
  2. Blog
  3. Tự động hóa thử nghiệm

Tự động hóa thử nghiệm

Hướng dẫn sử dụng Pytest cho người mới bắt đầu: Các phương pháp cố định, tham số hóa và ví dụ thực tế

Pytest cho phép bạn viết các bài kiểm tra Python với các hàm đơn giản và các câu lệnh khẳng định đơn giản. Từng bước xây dựng một bộ thử nghiệm nhỏ, đọc kết quả lỗi thực tế và tìm hiểu các tính năng bạn sẽ sử dụng hàng ngày.

Đọc 10 phút
Hướng dẫn Pytest cho người mới bắt đầu: đồ đạc, tham số hóa và ví dụ thực tế

Điểm chính

  • Pytest tìm các hàm có tên test_* và kiểm tra chúng bằng các câu lệnh assert đơn giản.
  • Fixtures cung cấp khả năng thiết lập và dọn dẹp có thể tái sử dụng, được yêu cầu chỉ bằng cách đặt tên chúng làm đối số.
  • @pytest.mark.parametrize chạy một thử nghiệm với nhiều đầu vào.
  • Đặt các đồ đạc dùng chung vào conftest.py và bạn không cần nhập chúng.

Nếu bạn tránh viết bài kiểm thử vì cảm thấy chúng như một công việc vặt thì hướng dẫn về pytest này sẽ khiến bạn thay đổi suy nghĩ. Pytest loại bỏ hầu hết nghi lễ: không có lớp nào để kế thừa và không có phương pháp xác nhận đặc biệt nào cần ghi nhớ. Một bài kiểm tra có thể chỉ có hai dòng.

Chúng tôi sẽ xây dựng một giỏ hàng nhỏ và thử nghiệm nó từng bước một. Chúng tôi đã chạy mọi thứ trên Python 3.13 với pytest 9.2 và kết quả hiển thị là có thật, mặc dù chúng tôi đã cắt bớt đường dẫn tệp và chi tiết thời gian sẽ khác nhau trên máy của bạn.

Tại sao pytest?

Python đi kèm với unittest, hoạt động tốt, nhưng pytest thường là lựa chọn thuận tiện hơn. Đây là cách kiểm tra giống nhau trong mỗi:

Nhiệm vụ nhỏ nhất pytest
Kiểm tra sự bình đẳng self.assertEqual(a, b) khẳng định a == b
Kiểm tra một ngoại lệ self.assertRaises(...) pytest.raises(...)
Cấu trúc thử nghiệm Một lớp kế thừa từ TestCase Một chức năng đơn giản
Thiết lập và dọn dẹp phương pháp setUp và tearDown Đồ đạc tái sử dụng
Nhiều đầu vào subTest vòng lặp tham số hóa

Pytest cũng có thể chạy các bài kiểm tra unittest hiện có của bạn để bạn có thể chuyển đổi dần dần. Nó cũng có một hệ sinh thái plugin lớn, bao gồm pytest-cov để bao phủ và pytest-xdist để chạy song song.

Cài đặt pytest

Trước tiên, hãy tạo một môi trường ảo, như được giải thích trong Hướng dẫn về môi trường ảo Python của chúng tôi, sau đó cài đặt nó:

pip install pytest
pytest --version

# pytest 9.2.0

Tạo một thư mục dự án chứa hai tệp cart.py và test_cart.py. Pytest tự động tìm các bài kiểm tra bằng cách tuân theo các quy tắc đặt tên: các tệp có tên test_*.py hoặc *_test.py, các hàm bắt đầu bằng test và các lớp bắt đầu bằng Test. Nếu bài kiểm tra không được chọn, việc đặt tên không khớp là điều đầu tiên cần kiểm tra.

Mã để kiểm tra

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

Những bài kiểm tra đầu tiên của bạn

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

Đó là một bài kiểm tra hoàn chỉnh. Chạy pytest từ thư mục dự án và nó báo cáo một bài kiểm tra đã vượt qua. Nếu bạn gặp lỗi nhập, hãy chạy nó dưới dạng python -m pytest, thao tác này sẽ thêm thư mục hiện tại vào đường dẫn nhập.

Lỗi đọc

Đây là nơi pytest thực sự tỏa sáng. Đây là một thử nghiệm với giá trị mong đợi sai có chủ ý:

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

Và đây là những gì nó in ra khi chúng tôi chạy nó:

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

Dòng > đánh dấu dòng bị lỗi và dòng E hiển thị các giá trị thực tế. Bạn không cần phải thêm thông báo tùy chỉnh vì pytest viết lại các câu lệnh assert để chúng có thể báo cáo những gì chúng so sánh. Nó thực hiện tương tự đối với danh sách và từ điển, chỉ ra chính xác những mục nào khác nhau.

Kiểm tra ngoại lệ

Xử lý lỗi cũng là hành vi và nó đáng được kiểm tra. pytest.raises chỉ vượt qua nếu khối đưa ra ngoại lệ dự kiến:

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

Đối số match tùy chọn sẽ kiểm tra thông báo bằng cách sử dụng biểu thức chính quy, do đó, một ValueError khác sẽ không vô tình bị bỏ qua. Để tìm hiểu cách phát hiện và xử lý các lỗi như thế này, hãy đọc hướng dẫn của chúng tôi về Xử lý ngoại lệ Python.

Đồ đạc: thiết lập có thể tái sử dụng

Hầu hết các bài kiểm tra đều cần chuẩn bị thứ gì đó trước tiên. fixture là một chức năng cung cấp nó. Trang trí nó bằng @pytest.fixture và bất kỳ thử nghiệm nào đặt tên nó làm đối số sẽ nhận được kết quả:

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Theo mặc định, mỗi bài kiểm tra sẽ có một giỏ hàng mới nên các bài kiểm tra không thể ảnh hưởng lẫn nhau. Pytest khớp tên đối số với tên của vật cố định và bạn không bao giờ tự gọi vật cố định. @pytest.fixture là một trình trang trí, được chúng tôi giải thích trong Các trình trang trí Python được giải thích.

Dọn dẹp với năng suất

Sử dụng yield thay vì return khi bạn cần dọn dẹp sau đó. Mã sau yield chạy khi quá trình kiểm tra kết thúc, ngay cả khi nó thất bại:

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

Chạy với -s để hiển thị kết quả in ra xác nhận rằng lệnh đã được mở, kiểm tra rồi đóng.

Phạm vi cố định và conftest.py

Theo mặc định, lịch thi đấu chạy một lần cho mỗi lần kiểm tra. Đối với thiết lập đắt tiền, chẳng hạn như cơ sở dữ liệu hoặc trình duyệt, hãy thay đổi thời gian tồn tại của nó bằng scope:

Phạm vi Được tạo một lần mỗi lần
function (mặc định) kiểm tra
lớp học Lớp kiểm tra
mô-đun Tập tin
gói Gói
phiên Toàn bộ quá trình chạy thử

Đặt các thiết bị cố định được nhiều tệp sử dụng vào một tệp có tên conftest.py. Pytest tự động tải nó nên các bài kiểm tra có thể sử dụng các thiết bị cố định của nó mà không cần nhập. Tuy nhiên, hãy cẩn thận với phạm vi được chia sẻ vì thay đổi được thực hiện bởi một thử nghiệm có thể bị rò rỉ sang thử nghiệm tiếp theo.

Tham số hóa: một thử nghiệm, nhiều đầu vào

Thay vì sao chép bài kiểm tra cho từng giá trị, hãy liệt kê các trường hợp:

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Mỗi hàng sẽ trở thành bài kiểm tra riêng và bạn có thể thấy điều này trong kết quả chi tiết từ quá trình chạy tệp hoàn chỉnh của chúng tôi:

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Nếu một hàng bị lỗi, các hàng khác vẫn chạy và tên cho bạn biết chính xác giá trị nào đã gây ra sự cố. Lưu ý rằng chúng tôi đã kết hợp tham số hóa với bộ cố định cart. Để chọn các giá trị có khả năng tìm thấy lỗi, hãy sử dụng phân tích giá trị biên.

Mẹo: Khi thông số của bạn dài hoặc không rõ ràng, hãy chuyển ids=["none", "ten", "full"] để đặt cho mỗi trường hợp một tên dễ đọc trong báo cáo.

Đồ đạc tích hợp hữu ích

Pytest bao gồm một số đồ đạc làm sẵn. Hai cái này đặc biệt hữu ích và cả hai đều vượt qua trong lần chạy của chúng tôi:

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path cung cấp cho mỗi bài kiểm tra một thư mục tạm thời duy nhất, do đó các bài kiểm tra không bao giờ chạm vào các tệp thực. monkeypatch thay đổi các biến hoặc thuộc tính môi trường và hoàn tác thay đổi khi quá trình kiểm tra kết thúc. Một tính năng hữu ích khác là capsys, ghi lại kết quả in để bạn có thể kiểm tra.

Điểm đánh dấu: bỏ qua và xfail

Điểm đánh dấu thêm nhãn và hành vi vào bài kiểm tra:

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip hoàn toàn không chạy thử nghiệm. xfail chạy nó nhưng dự kiến ​​sẽ thất bại, vì vậy một sự cố đã biết sẽ không làm hỏng bản dựng của bạn. Với các thử nghiệm bổ sung khác trong cùng một tệp, quá trình chạy của chúng tôi được tóm tắt là 3 passed, 1 skipped, 1 xfailed. Nhân tiện, bài kiểm tra làm tròn đó thực sự không thành công: trong số học dấu phẩy động, 0,1 + 0,2 không chính xác là 0,3. Sử dụng pytest.approx(0.3) khi so sánh số thập phân.

Bạn cũng có thể tạo điểm đánh dấu của riêng mình, chẳng hạn như @pytest.mark.slow và chỉ chạy những điểm có pytest -m slow hoặc bỏ chúng đi bằng -m "not slow". Đăng ký các điểm đánh dấu tùy chỉnh trong tệp cấu hình của bạn để tránh cảnh báo.

Cờ dòng lệnh hữu ích

Lệnh Nó làm gì
pytest -v Hiển thị từng tên bài kiểm tra
pytest -q Hiển thị bản tóm tắt ngắn hơn
pytest -x Dừng lại ở lần thất bại đầu tiên
giảm giá pytest -k Chạy thử nghiệm có tên khớp với một từ
pytest -s Hiển thị đầu ra print
pytest --lf Chỉ chạy lại những thất bại cuối cùng
pytest --pdb Mở trình gỡ lỗi khi bị lỗi
pytest test_cart.py::test_total Chạy một thử nghiệm cụ thể

Chạy pytest trong CI

Các thử nghiệm có giá trị nhất khi chúng chạy tự động sau mỗi thay đổi. Một công việc GitHub Actions tối thiểu trông như thế này:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest thoát với mã khác 0 khi kiểm tra thất bại, đây là nguyên nhân khiến đường ống dừng lại. Chúng tôi không thực thi tệp quy trình công việc này, vì vậy hãy điều chỉnh nó cho phù hợp với dự án của bạn. Hướng dẫn CI/CD GitHub Actions của chúng tôi giải thích chi tiết. Pytest cũng hoạt động tốt cho các thử nghiệm trình duyệt, như Hướng dẫn về Selenium Python và Hướng dẫn về Mô hình đối tượng trang của chúng tôi.

Lời kết

Giờ đây, bạn đã có những thứ mình cần cho hầu hết các bộ thử nghiệm Python: xác nhận đơn giản, đồ đạc cố định để thiết lập, tham số hóa cho các biến thể và một vài cờ cho tốc độ. Bắt đầu nhỏ. Chọn một chức năng mà bạn vừa sửa một lỗi và viết bài kiểm tra lỗi đó trước. Nếu bạn không chắc chắn nên kiểm tra cái gì ở mỗi cấp độ, hãy đọc phần kiểm thử đơn vị và kiểm thử tích hợp.

Câu hỏi thường gặp

Pytest dùng để làm gì?

Pytest là một khung thử nghiệm Python. Nó được sử dụng để kiểm tra đơn vị, tích hợp và API, đồng thời nó cũng hoạt động tốt với các công cụ trình duyệt như Selenium và Playwright.

Pytest có tốt hơn unittest không?

Nhiều đội thích nó vì cú pháp đơn giản hơn, các lỗi cố định và lỗi rõ ràng hơn. unittest không cần cài đặt và pytest cũng có thể chạy các bài kiểm tra unittest hiện có.

Vật cố định trong pytest là gì?

Lịch thi đấu là một chức năng chuẩn bị những thứ mà bài kiểm tra cần, chẳng hạn như dữ liệu hoặc kết nối. Các bài kiểm tra nhận được nó bằng cách đặt tên nó làm đối số.

conftest.py là gì?

Nó là một tệp đặc biệt để chia sẻ đồ đạc và móc nối giữa các tệp thử nghiệm. Pytest tự động tải nó nên các đồ đạc của nó không cần câu lệnh nhập.

Tại sao pytest không tìm thấy bài kiểm tra của tôi?

Thông thường đó là vấn đề đặt tên. Các tệp phải được đặt tên là test_*.py hoặc *_test.py và các hàm phải bắt đầu bằng test. Đồng thời kiểm tra xem bạn đã chạy nó từ đúng thư mục chưa.

Tiếp tục học hỏi

Làm việc với Stack Quora

Cần trợ giúp về kiểm tra, WordPress hoặc SEO?

Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.

Trí tuệ nhân tạo

Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó

Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …

Đọc bài viết →
DevOps

Giải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng

Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…

Đọc bài viết →
Phát triển phần mềm

Giải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429

Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …

Đọc bài viết →
Tự động hóa kiểm thử

Chế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối

Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…

Đọc bài viết →
Kiểm thử phần mềm

Giải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%

Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

DELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại

DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ

Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…

Đọc bài viết →
Phát triển phần mềm

Giao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch

Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …

Đọc bài viết →
Phát triển phần mềm

Giải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng

Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…

Đọc bài viết →
Phát triển phần mềm

Hàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng

Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …

Đọc bài viết →
Trí tuệ nhân tạo

Đại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy

Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …

Đọc bài viết →
DevOps

Giám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết

Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…

Đọc bài viết →
DevOps

Docker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách

Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …

Đọc bài viết →
Tự động hóa kiểm thử

TDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each

TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế

Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh

Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Câu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp

TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…

Đọc bài viết →
Phát triển phần mềm

JWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động

JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…

Đọc bài viết →
Phát triển phần mềm

Giải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ

Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…

Đọc bài viết →
Phát triển phần mềm

Giải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế

Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …

Đọc bài viết →
Trí tuệ nhân tạo

Nhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản

nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…

Đọc bài viết →
DevOps

Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn

Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…

Đọc bài viết →
Tự động hóa kiểm thử

Kiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn

Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…

Đọc bài viết →
Kiểm thử phần mềm

Kiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6

Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…

Đọc bài viết →
Kiểm thử phần mềm

Trường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp

Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Tối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian

Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…

Đọc bài viết →
Cơ sở dữ liệu & SQL

SQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra

SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ

Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…

Đọc bài viết →
Phát triển phần mềm

Xử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ

Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…

Đọc bài viết →
Phát triển phần mềm

Các lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế

Các lớp và đối tượng Python được giải thích bằng mã mà chúng tôi đã chạy: __init__, các phương thức, thuộc tính lớp và phiên bản, tính kế thừa, thuộ…

Đọc bài viết →
Trí tuệ nhân tạo

Mô hình ngôn ngữ lớn là gì? LLM hoạt động như thế nào, được giải thích mà không cường điệu hóa

Mô hình ngôn ngữ lớn là gì? LLM được giải thích bằng ngôn ngữ đơn giản: mã thông báo, phần nhúng, sự chú ý, đào tạo, cửa sổ nhiệt độ và ngữ cảnh, mộ…

Đọc bài viết →
DevOps

Các lệnh Linux cho người mới bắt đầu: Hướng dẫn thiết bị đầu cuối cần thiết kèm ví dụ

Các lệnh Linux dành cho người mới bắt đầu, được nhóm theo tác vụ: điều hướng, tệp, xem nhật ký, grep, đường dẫn, quyền, quy trình và lưu trữ, cùng v…

Đọc bài viết →
Tự động hóa kiểm thử

Selenium vs Nhà viết kịch: Sự khác biệt chính, So sánh mã và nên chọn cái nào

Selenium và Playwright được so sánh: kiến trúc, chờ đợi, hỗ trợ trình duyệt và ngôn ngữ, gỡ lỗi, kiểm tra giống nhau ở cả hai công cụ, lời khuyên di…

Đọc bài viết →
Kiểm thử phần mềm

Phân vùng tương đương: Giải thích kỹ thuật thiết kế thử nghiệm bằng các ví dụ đã thực hiện

Giải thích về phân vùng tương đương: cách tìm các phân vùng hợp lệ và không hợp lệ, các ví dụ hoạt động theo độ tuổi, mật khẩu và phiếu giảm giá, cá…

Đọc bài viết →
Kiểm thử phần mềm

Mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: Sự khác biệt, Ma trận và ví dụ thực tế

Giải thích về mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: định nghĩa rõ ràng, ma trận bốn chiều với các ví dụ, thang đo cấp độ, a…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Hướng dẫn về truy vấn con SQL: Các loại, truy vấn con tương quan và TỒN TẠI kèm ví dụ

Hướng dẫn về truy vấn con SQL với các truy vấn chúng tôi đã chạy: truy vấn con vô hướng, IN, FROM và SELECT, truy vấn con tương quan, EXISTS, bẫy và…

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích về giao dịch SQL và ACID: Các mức CAM KẾT, ROLLBACK và Cô lập

Các giao dịch SQL và ACID được giải thích bằng chuyển khoản ngân hàng mà chúng tôi đã thực hiện: CAM KẾT, ROLLBACK, điểm lưu trữ, khóa, mức cách ly,…

Đọc bài viết →
Phát triển phần mềm

Bảng cheat lệnh Git: Các lệnh bạn thực sự sử dụng, kèm theo ví dụ

Một bảng ghi lệnh Git được nhóm theo nhiệm vụ: thiết lập, dàn dựng, nhánh, điều khiển từ xa, lưu trữ, lịch sử và hoàn tác các lỗi, với đầu ra từ kho…

Đọc bài viết →
Phát triển phần mềm

Giải thích về các lời hứa trong JavaScript: then, Catch, Promise.all và các lỗi thường gặp

Lời hứa JavaScript được giải thích bằng mã chúng tôi đã chạy: trạng thái, then và chuỗi bắt, xử lý lỗi, Promise.all, allSettled, chủng tộc và bất kỳ…

Đọc bài viết →
Phát triển phần mềm

Hướng dẫn từ điển Python: Phương thức, ví dụ và mẫu chung

Hướng dẫn từ điển Python với mã chúng tôi đã chạy: tạo, đọc và cập nhật các ký tự, các phương thức chính, hợp nhất, hiểu, đếm và nhóm các mẫu cũng n…

Đọc bài viết →
Trí tuệ nhân tạo

RAG là gì? Giải thích về thế hệ tăng cường truy xuất bằng một ví dụ hoạt động

RAG là gì? Thế hệ tăng cường truy xuất được giải thích từng bước: lập chỉ mục, phân nhóm, nhúng, truy xuất, một ví dụ Python hoạt động nhỏ, đánh giá…

Đọc bài viết →
DevOps

Hướng dẫn về Terraform cho người mới bắt đầu: Cơ sở hạ tầng dưới dạng mã từ tệp đầu tiên đến mô-đun

Hướng dẫn về Terraform dành cho người mới bắt đầu: bắt đầu không cần tài khoản đám mây, tìm hiểu về init, lập kế hoạch và áp dụng, sau đó là các biế…

Đọc bài viết →
DevOps

Docker vs Kubernetes: Key Differences, How They Work Together and Which You Need

Docker vs Kubernetes giải thích: mỗi cái làm gì, cùng một ứng dụng chạy với cả hai, so sánh Docker Compose và Swarm, sự thay đổi của dockershim và c…

Đọc bài viết →
Tự động hóa kiểm thử

Hướng dẫn Pytest cho người mới bắt đầu: Đồ đạc, tham số hóa và ví dụ thực tế

Hướng dẫn về pytest dành cho người mới bắt đầu với các bài kiểm tra chúng tôi đã chạy trên pytest 9.2: xác nhận, đồ đạc, tham số, conftest, điểm đán…

Đọc bài viết →
Kiểm thử phần mềm

Vòng đời kiểm thử phần mềm (STLC): 6 giai đoạn, tiêu chí đầu vào và đầu ra, ví dụ

Vòng đời kiểm thử phần mềm giải thích: sáu giai đoạn STLC với tiêu chí đầu vào và đầu ra, sản phẩm phân phối, ví dụ về tính năng đăng nhập hoạt động…

Đọc bài viết →
Phát triển phần mềm

Git merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào

Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.

Đọc bài viết →
Phát triển phần mềm

List comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh

List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.

Đọc bài viết →
Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.

Đọc bài viết →