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%

  1. Trang chủ
  2. Blog
  3. Kiểm thử phần mềm

Kiểm thử phần mềm

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

Phạm vi bảo hiểm cho bạn biết mã mà bài kiểm tra của bạn đã chạy. Nó không cho bạn biết liệu các bài kiểm tra có kiểm tra được điều gì hay không. Chúng tôi đã đo một mô-đun nhỏ theo ba cách để cho thấy sự khác biệt.

Đọc 8 phút
Giải thích phạm vi mã: phạm vi dòng so với chi nhánh và ý nghĩa thực sự của 100%

Điểm chính

  • Mức độ bao phủ của mã đo lường lượng mã của bạn chạy trong quá trình kiểm tra.
  • Phạm vi phủ sóng của chi nhánh chặt chẽ hơn phạm vi phủ sóng của đường dây và hữu ích hơn.
  • Trong thử nghiệm của chúng tôi, một bộ phần mềm có không có xác nhận nào vẫn đạt mức độ bao phủ 100%.
  • Sử dụng phạm vi bảo hiểm để tìm mã chưa được kiểm tra chứ không phải làm bằng chứng về chất lượng.

Một nhóm tự hào báo cáo mức độ bao phủ mã là 95%, sau đó gửi lỗi trong một dòng đã được “che đậy”. Đây không phải là một mâu thuẫn. Phạm vi bảo hiểm trả lời một câu hỏi hẹp: các bài kiểm tra có thực thi mã này không? Liệu họ có kiểm tra kết quả hay không lại là một câu hỏi hoàn toàn khác.

Chúng tôi đã sử dụng Python với cover.py 7.17 và pytest 9.2. Mỗi con số và báo cáo dưới đây là từ hoạt động của chúng tôi. Những ý tưởng áp dụng trong bất kỳ ngôn ngữ.

Bảo hiểm mã là gì?

Phạm vi mã là tỷ lệ phần trăm mã của bạn chạy trong khi chạy thử nghiệm tự động. Một công cụ ghi lại dòng nào và tùy chọn nhánh nào đã được thực thi, sau đó báo cáo những gì bị bỏ sót.

Nó hữu ích nhất khi đảo ngược. Mức độ bao phủ thấp ở một khu vực sẽ cho bạn biết một cách chắc chắn rằng các cuộc kiểm tra không thực hiện được khu vực đó. Độ che phủ cao cho bạn biết ít hơn nhiều.

Các loại bảo hiểm

Loại Hỏi nó trả lời
chức năng Mỗi hàm có được gọi ít nhất một lần không?
Dòng (câu lệnh) Mỗi dòng có chạy ít nhất một lần không?
chi nhánh Mỗi if có đi theo cả hai hướng, đúng và sai không?
tình trạng Mỗi phần của điều kiện kết hợp (a and b) có nhận cả hai giá trị không?
MC/DC Mỗi điều kiện có làm thay đổi kết quả một cách độc lập không? Được sử dụng trong phần mềm quan trọng về an toàn.

Mỗi cấp độ chặt chẽ hơn cấp độ trên nó. Hầu hết các đội đều theo dõi phạm vi phủ sóng của tuyến và nhánh. Phạm vi điều kiện và MC/DC xuất hiện trong các tiêu chuẩn hàng không và ô tô, nơi hỗ trợ dụng cụ chuyên dụng.

Mã chúng tôi đã đo

def shipping_fee(total, is_member, express=False):
    if total < 0:
        raise ValueError("total cannot be negative")
    fee = 0 if total >= 1000 else 50
    if is_member:
        fee = max(fee - 25, 0)
    if express:
        fee += 100
    return fee

Tệp thử nghiệm đầu tiên của chúng tôi có hai thử nghiệm:

def test_regular_order():
    assert shipping_fee(500, False) == 50

def test_member_express():
    assert shipping_fee(500, True, express=True) == 125

Chúng tôi đã chạy nó với tính năng đo nhánh được bật:

coverage run --branch -m pytest test_shipping.py
coverage report -m

Đọc báo cáo

Name          Stmts   Miss Branch BrPart  Cover   Missing
---------------------------------------------------------
shipping.py       9      1      6      1    87%   3
  • Stmts 9, Miss 1: chín câu lệnh thực thi, một câu lệnh chưa bao giờ chạy.
  • Nhánh 6, BrPhần 1: ba if quyết định đưa ra sáu kết quả có thể xảy ra. Một quyết định chỉ đi một chiều.
  • Thiếu 3: dòng 3, raise ValueError, chưa bao giờ chạy. Không có bài kiểm tra nào vượt qua tổng số âm.

Bản sửa lỗi là một bản kiểm tra đường dẫn lỗi. Chúng tôi cũng đã thêm một thử nghiệm cho một đơn đặt hàng lớn:

def test_free_over_1000():
    assert shipping_fee(1000, False) == 0

def test_negative_total():
    with pytest.raises(ValueError):
        shipping_fee(-1, False)

Với cả hai tệp, báo cáo hiển thị 100% và không thiếu dòng hoặc nhánh một phần. Đường dẫn lỗi là cách phát hiện phạm vi khoảng trống cổ điển, đó là lý do tại sao việc kiểm tra đầu vào không hợp lệ, được thiết kế bằng các kỹ thuật như phân vùng tương đương, lại kết hợp rất tốt với nó.

Báo cáo che giấu điều gì

Hãy xem lại báo cáo đầu tiên. Nó báo chỉ thiếu dòng 3. Nhưng cả hai thử nghiệm đầu tiên đều sử dụng tổng cộng 500, vì vậy quy tắc giao hàng miễn phí cho các đơn hàng từ 1000 trở lên là chưa bao giờ được thử nghiệm và báo cáo không gắn cờ điều đó.

Lý do là fee = 0 if total >= 1000 else 50 nằm trên một dòng. vùng phủ sóng.py đo các nhánh giữa các dòng, do đó, một biểu thức điều kiện bên trong một dòng được tính là một câu lệnh được thực thi. Nếu quy tắc đó có lỗi, chẳng hạn như > thay vì >=, thì bộ đầu tiên vẫn hiển thị 87% mà không có gợi ý. Các thử nghiệm về chính ranh giới, như được mô tả trong phân tích giá trị biên, chính là điều giúp phát hiện ra điều đó.

Bảo hiểm 100% không cần kiểm tra

Tiếp theo, chúng tôi đã viết một bài kiểm tra kém cỏi có chủ ý gọi mọi đường dẫn nhưng không xác nhận gì:

def test_runs_everything_but_checks_nothing():
    shipping_fee(500, True, express=True)
    shipping_fee(1000, False)
    shipping_fee(500, False)
    try:
        shipping_fee(-1, False)
    except ValueError:
        pass
shipping.py       9      0      6      0   100%

Nó đã đạt 100% phạm vi phủ sóng của tuyến và nhánh. Hàm có thể trả về bất kỳ số nào và bài kiểm tra này vẫn vượt qua. Đây là giới hạn cốt lõi của phạm vi áp dụng: nó đo lường việc thực thi chứ không phải xác minh.

Mẹo: Khi xem xét yêu cầu kéo, hãy đọc các xác nhận chứ không chỉ thay đổi phạm vi. Một thử nghiệm bổ sung mức độ bao phủ mà không có xác nhận có ý nghĩa chỉ làm tăng thêm độ tin cậy sai lầm.

Để đo xem liệu các thử nghiệm có thực sự phát hiện được lỗi hay không, hãy sử dụng thử nghiệm đột biến. Một công cụ như mutmut cho Python, PIT cho Java hoặc Stryker cho JavaScript thực hiện những thay đổi nhỏ đối với mã của bạn, chẳng hạn như chuyển >= thành > và kiểm tra xem thử nghiệm có thất bại hay không. Thử nghiệm không xác nhận của chúng tôi sẽ cho phép mọi đột biến tồn tại.

Đặt mục tiêu gì

Không có con số chính xác phổ quát. Hướng dẫn thực hành:

  • Đừng theo đuổi 100%. Một vài phần trăm cuối cùng thường có nghĩa là kiểm tra mã tầm thường hoặc viết các bài kiểm tra chỉ chạm vào dòng.
  • Nhiều nhóm đặt mục tiêu đạt khoảng 70 đến 85% tổng thể, với kỳ vọng cao hơn về logic kinh doanh cốt lõi.
  • Hãy xem xu hướng chứ không phải con số. Mức độ phù hợp giảm dần sau mỗi lần phát hành là một dấu hiệu cảnh báo.
  • Yêu cầu bao gồm mã mới trong các yêu cầu kéo thay vì buộc tất cả mã cũ phải được đưa lên cùng một lúc.
  • Loại trừ những gì không quan trọng, chẳng hạn như mã được tạo, bằng các quy tắc rõ ràng.

Áp dụng định luật Goodhart: khi một biện pháp trở thành mục tiêu thì biện pháp đó không còn là biện pháp tốt nữa. Mục tiêu cứng khuyến khích các bài kiểm tra như ví dụ không có khẳng định của chúng tôi.

Công cụ theo ngôn ngữ

Ngôn ngữ Công cụ thông dụng
Python vùng phủ sóng.py, pytest-cov
JavaScript / TypeScript Istanbul (nyc), được xây dựng trong Jest và Vitest
Java JaCoCo
.NET Khăn phủ bàn
Đi đi kiểm tra -cover
Báo cáo Codecov, SonarQube, Quần yếm

Bảo hiểm trong CI

Chạy phạm vi đưa tin như một phần của quy trình CI của bạn và xuất bản báo cáo để người đánh giá có thể biết dòng mới nào chưa được kiểm tra. Với vùng phủ sóng.py, coverage report --fail-under=80 không xây dựng được dưới ngưỡng. Giữ bất kỳ ngưỡng nào ở mức khiêm tốn và kết hợp nó với quy tắc về mã mới, để một tệp kế thừa lớn duy nhất không chặn mọi thay đổi.

Ngoài phạm vi bảo hiểm: những câu hỏi hay hơn để hỏi

  • Các thử nghiệm có bao gồm các phần mã có rủi ro, thường xuyên được thay đổi không?
  • Các ranh giới và đường dẫn lỗi có được kiểm tra chứ không chỉ là đường dẫn hạnh phúc không?
  • Thử nghiệm có thất bại nếu dòng này sai không?
  • Các thử nghiệm có đủ nhanh và ổn định để chạy trên mọi thay đổi không?

Những điều này thuộc về bất kỳ chiến lược thử nghiệm nào. Bảo hiểm chỉ giúp trả lời câu hỏi đầu tiên.

Loại trừ mã và đọc báo cáo HTML

Một số mã không đáng để kiểm tra trực tiếp, chẳng hạn như trình trợ giúp gỡ lỗi hoặc một khối chỉ chạy khi tập lệnh được khởi động bằng tay. cover.py cho phép bạn loại trừ các dòng có nhận xét:

if __name__ == "__main__":  # pragma: no cover
    main()

Bạn cũng có thể đặt các loại trừ và thư mục nguồn để đo trong cấu hình, ví dụ như trong pyproject.toml:

[tool.coverage.run]
branch = true
source = ["shop"]

[tool.coverage.report]
show_missing = true
exclude_also = ["if TYPE_CHECKING:"]

Sử dụng các loại trừ một cách tiết kiệm và xem xét chúng như mã. Mỗi cái là một quyết định mà một số dòng sẽ không bao giờ được kiểm tra. Loại trừ một trình xử lý lỗi khó kiểm tra chỉ để nâng số đánh bại mục đích.

Đối với công việc hàng ngày, báo cáo HTML hữu ích hơn bảng đầu cuối. Chạy coverage html và mở htmlcov/index.html. Mỗi tệp được hiển thị với các dòng thực thi màu xanh lục, các dòng bị thiếu màu đỏ và các nhánh một phần màu vàng, vì vậy bạn có thể nhanh chóng thấy if không bao giờ đi theo đường dẫn khác. Nhiều người soạn thảo cũng có thể hiển thị mức độ phù hợp ở lề, điều này làm cho các khoảng trống hiển thị trong khi bạn viết mã thay vì sau đó.

Bảo hiểm trước khi tái cấu trúc

Bảo hiểm cũng là một kiểm tra an toàn trước khi tái cấu trúc. Nếu bạn dự định cơ cấu lại một mô-đun, trước tiên hãy xem báo cáo của mô-đun đó. Các vùng màu đỏ không có bài kiểm tra nào để cảnh báo bạn nếu hành vi thay đổi, vì vậy hãy thêm các bài kiểm tra mô tả đặc điểm để nắm bắt hành vi hiện tại trước khi bạn bắt đầu. Được sử dụng theo cách này, phạm vi bảo hiểm không còn là mục tiêu nữa mà trở thành một công cụ lập kế hoạch thực tế.

Báo cáo tương tự sẽ hữu ích khi một lỗi thoát ra môi trường sản xuất. Tìm dòng nơi lỗi tồn tại và kiểm tra xem có thử nghiệm nào chạy nó hay không. Nếu không, bạn đã tìm thấy một khoảng trống đáng để thu hẹp. Nếu một thử nghiệm đã chạy nó thì vấn đề là một xác nhận yếu, đó chính xác là tình huống mà ví dụ không có xác nhận của chúng tôi đã chỉ ra. Cả hai câu trả lời đều cho bạn biết cách cải thiện bộ phần mềm.

Lời kết

Phạm vi mã là đèn pin, không phải là điểm. Sử dụng phạm vi nhánh để tìm mã mà không cần kiểm tra, đặc biệt là xử lý lỗi và sau đó viết các bài kiểm tra đưa ra các xác nhận thực sự. Nếu bạn nhớ một kết quả từ lần chạy của chúng tôi, hãy ghi kết quả này: mức độ bao phủ 100% đạt được bằng một thử nghiệm không kiểm tra gì.

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

Phạm vi mã trong thử nghiệm là gì?

Đó là tỷ lệ phần trăm mã được thực thi trong khi chạy thử nghiệm tự động, được đo bằng dòng, nhánh hoặc điều kiện. Nó cho thấy những gì đã được kiểm tra, chứ không phải liệu họ có xác minh nó hay không.

Sự khác biệt giữa phạm vi phủ sóng của đường dây và chi nhánh là gì?

Phạm vi dòng kiểm tra xem mỗi dòng đã chạy chưa. Bảo hiểm chi nhánh kiểm tra xem mỗi quyết định có được thực hiện theo cả hai hướng hay không. Phạm vi chi nhánh tìm thấy các đường dẫn chưa được kiểm tra mà phạm vi phủ sóng của tuyến bỏ sót.

Bảo hiểm mã 100% có tốt không?

Không phải tự nó. Trong thử nghiệm của chúng tôi, một bộ không có xác nhận nào đã đạt 100%. Nhằm mục đích kiểm tra có ý nghĩa trên mã quan trọng hơn là một con số hoàn hảo.

Tỷ lệ bao phủ mã tốt là gì?

Nhiều nhóm nhắm mục tiêu tổng thể khoảng 70 đến 85%, tập trung nhiều hơn vào logic quan trọng. Xu hướng và chất lượng của các khẳng định quan trọng hơn con số chính xác.

Thử nghiệm đột biến khác với thử nghiệm bao phủ như thế nào?

Kiểm tra đột biến thay đổi mã của bạn một chút và kiểm tra xem thử nghiệm có thất bại hay không. Nó đo lường xem các cuộc kiểm tra có phát hiện ra lỗi hay không, điều mà phạm vi bảo hiểm không thể làm được.

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

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 →