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
Bạn không thể kiểm tra mọi đầu vào có thể, vậy bạn nên chọn giá trị nào? Phân vùng tương đương cho bạn câu trả lời rõ ràng. Tìm hiểu phương pháp này từng bước, làm việc thông qua các ví dụ thực tế và xem nó cần trợ giúp ở đâu.
- Phân vùng tương đương chia đầu vào thành các nhóm sẽ hoạt động theo cùng một cách.
- Bạn kiểm tra một giá trị đại diện từ mỗi nhóm thay vì mọi giá trị.
- Luôn bao gồm các phân vùng không hợp lệ, vì việc xử lý lỗi là nơi ẩn chứa nhiều lỗi.
- Nó hoạt động tốt nhất cùng với phân tích giá trị biên, vì lỗi thường nằm ở rìa của một nhóm.
Trường độ tuổi chấp nhận từ 18 đến 60 có số lượng đầu vào khổng lồ có thể có, khi bạn đếm số âm, số lượng lớn, văn bản và khoảng trống. Không ai có thể thử tất cả. Phân vùng tương đương giải quyết vấn đề này bằng cách nhóm các đầu vào mà phần mềm sẽ xử lý theo cùng một cách, sau đó kiểm tra một giá trị từ mỗi nhóm.
Đây là một trong những kỹ thuật thiết kế thử nghiệm đầu tiên mà mọi người thử nghiệm nên học. Trong hướng dẫn này, chúng tôi thực hiện từng bước một và kiểm tra một ví dụ trong Python. Chúng tôi đã chạy mã đó trên Python 3.13 và bao gồm đầu ra của nó. Các quy định về mật khẩu và coupon dưới đây là ví dụ minh họa, không lấy từ hệ thống thực tế.
Phân vùng tương đương là gì?
Phân vùng tương đương, còn được gọi là phân vùng lớp tương đương (ECP), là một kỹ thuật thiết kế kiểm thử hộp đen. Nó chia các đầu vào có thể có của một tính năng thành phân vùng hoặc các lớp. Mọi giá trị bên trong một phân vùng dự kiến sẽ tạo ra cùng một loại hành vi.
Vì không cần xem mã nên bạn có thể áp dụng trực tiếp từ yêu cầu. Để tìm hiểu thêm về phong cách thử nghiệm này, hãy đọc thử nghiệm hộp đen và hộp trắng.
Tại sao nó hoạt động
Kỹ thuật này dựa trên một giả định: nếu một giá trị trong phân vùng tìm thấy lỗi thì các giá trị khác trong phân vùng đó cũng có thể tìm thấy lỗi đó. Và nếu một giá trị vượt qua thì những giá trị khác cũng có thể vượt qua. Việc kiểm tra 25, 26 và 27 ở lĩnh vực dành cho người trưởng thành có thể không cho bạn biết điều gì mà riêng việc kiểm tra 25 thì không.
| Cách tiếp cận | Kiểm tra trường tuổi | kết quả |
|---|---|---|
| đầy đủ | Mọi giá trị có thể | Không thể thực hiện được |
| Đoán ngẫu nhiên | Bất cứ điều gì chợt đến trong tâm trí | Sự trùng lặp và khoảng trống |
| Phân vùng tương đương | Một cho mỗi phân vùng | Nhỏ, có chủ ý che phủ |
Tuy nhiên, đó là một giả định chứ không phải là một sự đảm bảo. Phần mềm có thể có các trường hợp đặc biệt ẩn bên trong một phân vùng, một hạn chế mà chúng ta sẽ quay lại sau.
Cách thực hiện trong năm bước
- Đọc yêu cầu và xác định dữ liệu đầu vào cũng như các quy tắc của nó.
- Tìm các phân vùng hợp lệ, là các nhóm giá trị nên được chấp nhận và lưu ý xem các phạm vi khác nhau có hoạt động khác nhau hay không.
- Tìm các phân vùng không hợp lệ, bao gồm các giá trị quá thấp, quá cao, sai loại và trống.
- Chọn một giá trị đại diện từ mỗi phân vùng, thường ở đâu đó ở giữa.
- Viết ra kết quả mong đợi cho mỗi trường hợp, như trong bất kỳ trường hợp kiểm thử tốt nào.
Ví dụ hoạt động: trường tuổi
Yêu cầu: Người dùng từ 18 đến 60 tuổi có thể đăng ký.
| Phân vùng | Loại | Giá trị kiểm tra | Kết quả mong đợi |
|---|---|---|---|
| Dưới 18 | không hợp lệ | 10 | Bị từ chối |
| 18 đến 60 | hợp lệ | 35 | Đã chấp nhận |
| Trên 60 | không hợp lệ | 75 | Bị từ chối |
| Không phải là một con số | không hợp lệ | “abc” | Lỗi |
| trống | không hợp lệ | (empty) | Thông báo “Bắt buộc” |
Năm bài kiểm tra cung cấp cho bạn thông tin bao quát về mọi hành vi trong yêu cầu. Nhiều hướng dẫn dừng lại ở ba hàng đầu tiên, nhưng hai hàng cuối cùng là những hướng dẫn mà người dùng thực sự vô tình kích hoạt. Bạn cũng có thể thêm hàng cho số âm hoặc số thập phân, nếu những số đó có thể được xử lý theo cách khác một cách hợp lý.
Kiểm tra nó trong mã
Đây là quy tắc đó dưới dạng hàm, với một bài kiểm tra đơn vị cho mỗi phân vùng, sử dụng unittest tích hợp sẵn của Python:
import unittest
def can_register(age):
if not isinstance(age, int) or isinstance(age, bool):
raise TypeError("age must be a whole number")
return 18 <= age <= 60
class EquivalenceTests(unittest.TestCase):
def test_valid_partition(self):
self.assertTrue(can_register(35))
def test_too_young_partition(self):
self.assertFalse(can_register(10))
def test_too_old_partition(self):
self.assertFalse(can_register(75))
def test_wrong_type_partition(self):
with self.assertRaises(TypeError):
can_register("abc")
Cuộc chạy của chúng tôi đã trôi qua:
test_too_old_partition ... ok
test_too_young_partition ... ok
test_valid_partition ... ok
test_wrong_type_partition ... ok
Trong một dự án thực tế, tính năng tham số hóa của pytest là một cách gọn gàng để chạy bảng giá trị phân vùng thông qua một thử nghiệm duy nhất.
Ví dụ hoạt động: mật khẩu
Yêu cầu: Mật khẩu phải dài từ 8 đến 20 ký tự và chứa ít nhất một chữ số.
Quy tắc này có hai quy tắc, độ dài và nội dung, vì vậy chúng tôi xem xét phân vùng cho cả hai:
| Phân vùng | Loại | Giá trị kiểm tra | Kết quả mong đợi |
|---|---|---|---|
| Độ dài hợp lệ, có một chữ số | hợp lệ | mặt trời mọc42 |
Đã chấp nhận |
| Quá ngắn | không hợp lệ | abc1 |
Lỗi: quá ngắn |
| quá dài | không hợp lệ | Giá trị 30 ký tự có một chữ số | Lỗi: quá dài |
| Độ dài hợp lệ, không có chữ số | không hợp lệ | ngày bình minh |
Lỗi: cần chữ số |
| trống | không hợp lệ | (empty) | Lỗi: bắt buộc |
Lưu ý rằng mỗi bài kiểm tra không hợp lệ vi phạm chỉ một quy tắc. Nếu một giá trị đều quá ngắn và thiếu một chữ số thì bài kiểm tra đạt sẽ không thể cho bạn biết phép kiểm nào đã hoạt động. Một tấm séc có thể bị hỏng, trong khi tấm séc kia che giấu sự thật.
Ví dụ hoạt động: đầu vào không phải số
Kỹ thuật này không giới hạn ở phạm vi số. Các tùy chọn, danh mục và trạng thái riêng biệt cũng tạo thành các phân vùng. Giả sử một cửa hàng có quy tắc này:
Yêu cầu: Giao hàng miễn phí cho thành viên Vàng, 50 cho thành viên Bạc và 100 cho những người còn lại. Giá trị bậc không xác định là lỗi.
| Phân vùng | Giá trị kiểm tra | Phí dự kiến |
|---|---|---|
| Vàng | vàng |
0 |
| Bạc | bạc |
50 |
| Không có thành viên | (none) | 100 |
| Cấp độ không xác định | bạch kim |
Lỗi |
Ở đây, mỗi tùy chọn là một phân vùng riêng, vì mỗi tùy chọn sẽ hoạt động khác nhau. Các phân vùng phổ biến khác bao gồm các loại tệp, chẳng hạn như tải lên hợp lệ và không hợp lệ cũng như các nhóm dựa trên đầu ra, chẳng hạn như khoản vay được phê duyệt hoặc bị từ chối.
Mẹo: Hãy suy nghĩ về đầu ra cũng như đầu vào. Nếu phép tính có thể tạo ra chiết khấu, không chiết khấu hoặc cảnh báo, hãy đảm bảo ít nhất một phép thử đạt được từng kết quả đó.
Một số đầu vào cùng một lúc
Với nhiều trường, số lượng kết hợp tăng nhanh. Ba trường có bốn phân vùng, mỗi trường cho 64 kết hợp. Hai chiến lược giúp:
- Phạm vi bao phủ yếu: đảm bảo mỗi phân vùng xuất hiện trong ít nhất một thử nghiệm, kết hợp nhiều giá trị hợp lệ cho mỗi thử nghiệm. Đối với các giá trị không hợp lệ, hãy kiểm tra từng giá trị một để các lỗi không che lấp lẫn nhau.
- Phạm vi áp dụng dựa trên quy tắc: khi các kết hợp thực sự thay đổi kết quả, chẳng hạn như trạng thái thành viên với giá trị đơn hàng, hãy sử dụng kiểm tra bảng quyết định để liệt kê chúng đúng cách.
Ghép nối với phân tích giá trị biên
Việc phân vùng sẽ cho bạn biết nhóm nào cần kiểm tra. Nó nói rất ít về nơi trong một nhóm bọ thích ẩn náu và nhiều con ẩn ngay ở rìa. Để thể hiện điều này, chúng tôi đã viết một phiên bản có lỗi với từng lỗi cổ điển:
def buggy(age):
return 18 < age <= 60 # should be 18 <= age
[buggy(a) for a in (35, 10, 75)] # [True, False, False]
buggy(18) # False
Các giá trị phân vùng của chúng tôi, 35, 10 và 75, đều đưa ra câu trả lời đúng, vì vậy những bài kiểm tra đó sẽ vượt qua. Vậy mà một thanh niên 18 tuổi lại bị từ chối một cách sai lầm. Đây là lý do tại sao hai kỹ thuật này thuộc về nhau:
| Kỹ thuật | Lựa chọn | Giá trị dành cho độ tuổi từ 18 đến 60 |
|---|---|---|
| Phân vùng tương đương | Một giá trị bên trong mỗi nhóm | 10, 35, 75 |
| Phân tích giá trị biên | Giá trị tại các cạnh của mỗi nhóm | 17, 18, 60, 61 |
Sử dụng phân vùng để tìm các nhóm, sau đó xác định ranh giới để kiểm tra xem các nhóm gặp nhau ở đâu. Trong mã của chúng tôi, một thử nghiệm riêng cho 17, 18, 60 và 61 đã chuyển đúng chức năng và sẽ phát hiện được lỗi đó. Hướng dẫn phân tích giá trị biên của chúng tôi đề cập đầy đủ đến vấn đề này.
Ưu điểm và hạn chế
| Ưu điểm | Hạn chế |
|---|---|
| Giảm đáng kể số lượng bài kiểm tra | Dựa vào phân vùng là chính xác |
| Cung cấp phạm vi bảo hiểm rõ ràng, có thể giải thích | Có thể bỏ lỡ lỗi ở ranh giới |
| Không cần truy cập vào mã | Có thể bỏ lỡ các trường hợp đặc biệt ẩn |
| Áp dụng sớm, thậm chí từ yêu cầu | Không mô hình hóa trình tự hoặc sự kết hợp tốt |
Rủi ro lớn nhất là một giả định không chính xác. Nếu mã có quy tắc ẩn cho một giá trị cụ thể thì thử nghiệm bạn đã chọn có thể không đạt được quy tắc đó. Thử nghiệm thăm dò và phạm vi mã giúp bạn tìm ra những gì các phân vùng đã bỏ sót.
Những lỗi thường gặp
- Quên các phân vùng không hợp lệ. Chỉ kiểm tra các đường dẫn phù hợp sẽ bỏ chọn việc xử lý lỗi.
- Thử nghiệm nhiều giá trị từ một phân vùng. Việc này làm tăng thêm chi phí mà không có thông tin mới.
- Kết hợp nhiều giá trị không hợp lệ trong một thử nghiệm. Một lỗi có thể ẩn một lỗi khác.
- Bỏ qua ranh giới. Chỉ kiểm tra phân vùng thường bỏ sót từng lỗi một.
- Đoán quy tắc. Nếu yêu cầu không rõ ràng, hãy hỏi. 60 có nên bao gồm những người 60 tuổi rưỡi không?
Lời kết
Phân vùng tương đương thay thế “tôi nên viết bao nhiêu bài kiểm tra?” bằng một câu hỏi hay hơn nhiều: “những hành vi nào tồn tại và tôi đã đề cập đến từng hành vi đó chưa?” Để dùng thử, hãy lấy một mẫu bạn đang kiểm tra hôm nay và liệt kê các phân vùng của nó trên giấy, bao gồm cả những phân vùng không hợp lệ. Thêm ranh giới tiếp theo. Bạn thường sẽ kết thúc với ít bài kiểm tra tìm ra nhiều lỗi hơn.
Câu hỏi thường gặp
Phân vùng tương đương trong thử nghiệm là gì?
Đó là một kỹ thuật hộp đen chia đầu vào thành các nhóm dự kiến sẽ hoạt động giống nhau. Sau đó, bạn kiểm tra một giá trị đại diện từ mỗi nhóm chứ không phải mọi giá trị.
Sự khác biệt giữa phân vùng tương đương và phân tích giá trị biên là gì?
Phân vùng chọn một giá trị từ bên trong mỗi nhóm. Phân tích giá trị biên kiểm tra các giá trị ở rìa của các nhóm đó. Chúng thường được sử dụng cùng nhau.
Cần bao nhiêu trường hợp thử nghiệm để phân vùng tương đương?
Thông thường có ít nhất một cho mỗi phân vùng, cả hợp lệ và không hợp lệ. Một lĩnh vực về độ tuổi thường cần khoảng ba đến năm bài kiểm tra.
Phân vùng tương đương là hộp đen hay hộp trắng?
Đây là một kỹ thuật hộp đen, vì các phân vùng xuất phát từ yêu cầu và không cần mã. Tuy nhiên, các nhà phát triển cũng có thể áp dụng nó cho các bài kiểm tra đơn vị.
Phân vùng hợp lệ và không hợp lệ là gì?
Các phân vùng hợp lệ chứa các giá trị mà hệ thống sẽ chấp nhận. Các phân vùng không hợp lệ chứa các giá trị cần từ chối, chẳng hạn như số ngoài phạm vi, loại sai và khoảng trống.
Tiếp tục học hỏi
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.
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.
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 →DevOpsGiả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ềmGiả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ềmGiả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 & SQLDELETE 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 & SQLGiả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ềmGiao 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ềmGiả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ềmHà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 →DevOpsGiá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 →DevOpsDocker 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ềmKiể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 & SQLGiả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 & SQLCâ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ềmJWT 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ềmGiả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ềmGiả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ạoNhú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 →DevOpsTriể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ềmKiể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ềmTrườ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 & SQLTố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 & SQLSQL 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ềmHướ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ềmXử 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ềmCá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ạoMô 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 →DevOpsCá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ềmPhâ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ềmMứ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 & SQLHướ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 & SQLGiả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ềmGit 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ềmList 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 & SQLGiả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 →