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

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

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

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

Một bài kiểm tra thất bại ngẫu nhiên sẽ dạy cho nhóm của bạn cách bỏ qua những thất bại. Tìm hiểu cách xác nhận quá trình kiểm tra không ổn định, theo dõi nguyên nhân thực sự và khắc phục nó bằng các bản trình diễn hiển thị những gì thực sự hoạt động.

Đọc 9 phút
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

Điểm chính

  • Thử nghiệm không ổn định đạt và không thành công trên cùng một mã mà không có thay đổi nào.
  • Các nguyên nhân thông thường là do thời gian, trạng thái chia sẻ, dữ liệu không ổn định, dịch vụ bên ngoài và sự khác biệt về môi trường.
  • Thay thế các chế độ ngủ cố định bằng các chế độ chờ cho một điều kiện cụ thể và cung cấp cho mỗi bài kiểm tra dữ liệu riêng.
  • Việc thử lại có thể ẩn các lỗi thực sự. Cách ly một bài kiểm tra không ổn định, sửa nó trong thời hạn hoặc xóa nó.

Bản dựng chuyển sang màu đỏ, ai đó nhấp vào “chạy lại”, nó vượt qua và mọi người tiếp tục. Điều này có vẻ vô hại, nhưng các thử nghiệm không ổn định đang dần phá hủy thứ quý giá nhất mà một bộ thử nghiệm có được: niềm tin của mọi người vào nó. Khi lỗi thường là tiếng ồn, lỗi thực sự cũng xuất hiện.

Hướng dẫn này đề cập đến lý do tại sao các bài kiểm tra trở nên không ổn định và cách khắc phục đúng từng nguyên nhân. Chúng tôi đã chạy các bản trình diễn về thời gian và trạng thái chia sẻ trong Python 3.13 và các con số được hiển thị là từ các lần chạy đó. Chúng là những minh chứng nhỏ được thiết kế để làm cho dễ dàng nhận thấy sự không ổn định, do đó tỷ lệ thất bại của bạn sẽ khác nhau.

Kiểm tra không ổn định là gì?

Kiểm thử không ổn định sẽ cho kết quả khác nhau trên cùng một mã. Nó trôi qua trong một lần chạy và thất bại ở lần chạy tiếp theo, mặc dù không có gì trong sản phẩm thay đổi. Quá trình kiểm tra có thể có lỗi hoặc mã có thể chứa một lỗi thực sự không liên tục. Khả năng thứ hai đó chính là lý do tại sao bạn không nên đơn giản loại bỏ chúng.

Tại sao các bài kiểm tra không ổn định lại tốn kém đến vậy

  • Mất niềm tin. Khi mọi người cho rằng màu đỏ có nghĩa là “có thể không ổn định”, họ sẽ ngừng điều tra những thất bại thực sự.
  • Lãng phí thời gian. Các nhà phát triển dành hàng giờ để chạy lại quy trình và kiểm tra các lỗi không liên quan đến thay đổi của họ.
  • Phân phối chậm hơn. Việc hợp nhất và phát hành chờ khi chạy lại, làm suy yếu quan điểm của CI/CD.
  • Lỗi ẩn. Các điều kiện cạnh tranh trong sản phẩm có thể trông giống như tiếng ồn khi thử nghiệm và đó là những lỗi gây tổn hại trong quá trình sản xuất.

Sơ lược về các nguyên nhân phổ biến

nguyên nhân Dấu hiệu điển hình Sửa thông thường
Thời gian và không đồng bộ Thất bại nhiều hơn khi CI bận Chờ một điều kiện
Trạng thái chia sẻ Thất bại tùy theo thứ tự kiểm tra Cô lập dữ liệu, thiết lập lại trạng thái
Ngày tháng và sự ngẫu nhiên Thất bại vào những thời điểm hoặc ngày nhất định Kiểm soát đồng hồ và hạt giống
Bộ chọn giòn Thất bại sau khi thay đổi giao diện người dùng Sử dụng bộ định vị ổn định
Dịch vụ bên ngoài Thất bại khi phần phụ thuộc chậm Giả hoặc bỏ chúng
Sự khác biệt về môi trường Đạt cục bộ, thất bại trong CI Căn chỉnh với các thùng chứa
Giới hạn tài nguyên Thất bại khi chạy song song Điều chỉnh công nhân, khắc phục sự tranh chấp

Nguyên nhân 1: Thời gian và giấc ngủ cố định

Đây là nguyên nhân phổ biến nhất. Quá trình kiểm thử giả định rằng công việc nền sẽ hoàn tất sau một khoảng thời gian trễ cố định. Để thấy được hiệu quả, chúng tôi đã viết một bài kiểm tra nhỏ trong đó công việc mất tới 2 mili giây, trong khi bài kiểm tra chỉ đợi 1 mili giây trước khi kiểm tra:

def flaky_timing():
    result = {}
    def work():
        time.sleep(random.uniform(0, 0.002))
        result["done"] = True
    threading.Thread(target=work).start()
    time.sleep(0.001)        # hope it has finished
    assert result.get("done")

Cách khắc phục là chờ điều kiện thực tế, với giới hạn trên rộng rãi:

def fixed_timing():
    result = threading.Event()
    def work():
        time.sleep(random.uniform(0, 0.002))
        result.set()
    threading.Thread(target=work).start()
    assert result.wait(timeout=1)   # continues as soon as it is ready

Chúng tôi đã chạy mỗi phiên bản 200 lần:

Phiên bản Thất bại trong số 200
cố định giấc ngủ 102
Chờ một điều kiện 0

Kết quả không chỉ là độ tin cậy. Phiên bản cố định sẽ di chuyển ngay khi công việc hoàn thành nên thường nhanh hơn. Giấc ngủ dài hơn sẽ làm cho phiên bản đầu tiên ít bị lỗi hơn, nhưng mỗi lần chạy sau đó sẽ chậm hơn và nó vẫn có thể bị lỗi trên máy CI đang bận.

Trong các thử nghiệm trình duyệt, nguyên tắc tương tự cũng được áp dụng. Sử dụng tính năng tự động chờ của Playwright hoặc Selenium waits rõ ràng, thay vì time.sleep:

# Playwright: retries until true or a timeout is reached
expect(page.get_by_text("Order placed")).to_be_visible()

# Selenium: an explicit wait for a condition
WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, "confirmation"))
)

Nguyên nhân 2: Trạng thái chia sẻ và thứ tự kiểm tra

Khi các thử nghiệm chia sẻ dữ liệu, một thử nghiệm có thể ảnh hưởng đến dữ liệu khác và kết quả phụ thuộc vào thứ tự chúng chạy. Hai thử nghiệm này sử dụng một danh sách chung:

store = []

def test_add():
    store.append("x")
    assert len(store) == 1

def test_empty():
    assert store == []
Đặt hàng test_add test_empty
trống rồi thêm Vượt qua Vượt qua
thêm vào rồi để trống Vượt qua Thất bại

Quá trình chạy của chúng tôi đã xác nhận điều này và đó là lý do tại sao một bộ phần mềm có thể trôi qua trong nhiều tháng và sau đó bị hỏng khi ai đó thêm các lần chạy song song hoặc plugin đặt hàng ngẫu nhiên. Cách chữa trị là sự cô lập:

  • Cung cấp cho mỗi bài kiểm tra dữ liệu mới, sử dụng công cụ cố định để thiết lập và dọn dẹp dữ liệu đó. Hướng dẫn pytest của chúng tôi chỉ ra cách thực hiện.
  • Tạo các bản ghi duy nhất, chẳng hạn như email có hậu tố ngẫu nhiên, thay cho “người dùng thử nghiệm” được chia sẻ.
  • Gói các kiểm tra cơ sở dữ liệu vào một giao dịch và khôi phục nó khi thiết lập của bạn cho phép.
  • Chạy thử nghiệm theo thứ tự ngẫu nhiên thường xuyên để những vấn đề này xuất hiện sớm.

Nguyên nhân 3: Ngày, múi giờ và tính ngẫu nhiên

Một bài kiểm tra vượt qua cả tuần có thể thất bại vào thứ Bảy, lúc nửa đêm hoặc vào ngày cuối cùng của tháng. Biến thời gian thành đầu vào, thay vì đọc đồng hồ bên trong logic của bạn:

def is_weekend(today=None):
    today = today or datetime.date.today()
    return today.weekday() >= 5

is_weekend(datetime.date(2026, 11, 7))   # True  (a Saturday)
is_weekend(datetime.date(2026, 11, 9))   # False (a Monday)

Những bài kiểm tra đó cho cùng một câu trả lời vào bất kỳ ngày nào. Tương tự như vậy, hãy đặt một hạt giống cố định cho các giá trị ngẫu nhiên trong các thử nghiệm và ghi lại nó khi bạn sử dụng dữ liệu ngẫu nhiên để có thể tái tạo lỗi. Đừng giả sử một thứ tự cụ thể từ các bộ, từ điển từ các nguồn bên ngoài hoặc các truy vấn cơ sở dữ liệu không có ORDER BY.

Nguyên nhân 4: Bộ chọn giòn

Thử nghiệm tìm thấy nút có div:nth-child(3) > span sẽ bị hỏng khi thực hiện bất kỳ chỉnh sửa bố cục nào và có thể chỉ thất bại đối với một số kích thước hoặc biến thể màn hình. Ưu tiên các công cụ định vị dựa trên những gì người dùng nhìn thấy hoặc các thuộc tính kiểm tra chuyên dụng. Hướng dẫn của chúng tôi về Bộ định vị nhà viết kịch giải thích thứ tự thử chúng. Hoạt ảnh cũng là một nguồn rắc rối thường gặp khác, vì vậy hãy cân nhắc việc tắt chúng trong môi trường thử nghiệm.

Nguyên nhân 5: Dịch vụ và mạng bên ngoài

Nếu thử nghiệm gọi nhà cung cấp thanh toán thực hoặc API của bên thứ ba thì kết quả của thử nghiệm sẽ phụ thuộc vào giới hạn tốc độ và thời gian hoạt động của người khác. Giả lập những cuộc gọi đó cho hầu hết các cuộc thử nghiệm và giữ một số lượng nhỏ các cuộc kiểm tra hợp đồng riêng biệt đối với dịch vụ thực để bạn vẫn biết liệu nó có thay đổi hay không. Hướng dẫn của chúng tôi về thử nghiệm đơn vị và thử nghiệm tích hợp giải thích cách phân chia chúng.

Mẹo: “Đạt cục bộ, không thành công trong CI” thường có nghĩa là sự khác biệt về tốc độ, múi giờ, tài nguyên hoặc phiên bản. Việc chạy thử nghiệm trong cùng một hình ảnh vùng chứa cục bộ và trong CI sẽ loại bỏ nhiều trong số này. Hướng dẫn Docker Compose của chúng tôi có thể giúp ích.

Làm thế nào để chẩn đoán một bài kiểm tra không ổn định

  1. Xác nhận. Chạy thử nghiệm nhiều lần mà không thay đổi. Với pytest, một vòng lặp shell đơn giản sẽ hoạt động và một plugin như pytest-repeat sẽ cung cấp cho bạn --count=100.
  2. Ghi lại bằng chứng. Lưu nhật ký, ảnh chụp màn hình và dấu vết cho từng lỗi. Trình xem dấu vết của nhà viết kịch đặc biệt hữu ích ở đây.
  3. Nhấn mạnh các điều kiện. Chạy nó với CPU hạn chế, song song hoặc theo thứ tự ngẫu nhiên. Làm cho nó thất bại thường xuyên hơn làm cho việc học tập dễ dàng hơn.
  4. Kiểm tra nó một mình. Nếu nó luôn vượt qua một mình nhưng không thành công trong bộ phần mềm, nghi ngờ trạng thái chia sẻ.
  5. Tìm kiếm các mẫu. Kiểm tra xem máy nào, thời gian trong ngày và các bài kiểm tra lân cận có liên quan.
  6. Kiểm tra sản phẩm. Hãy thành thật hỏi xem đây có phải là tình trạng chạy đua thực sự trong ứng dụng của bạn hay không.

Việc thử lại tự động có phải là cách khắc phục không?

Thử lại là một mạng lưới an toàn ngắn hạn hữu ích và chúng không phải là cách chữa trị. Một lần thử lại tự động trong CI có thể giúp công việc tiếp tục diễn ra trong khi bạn điều tra, nhưng một bài kiểm tra cần thử lại để vượt qua vẫn cho bạn biết điều gì đó. Tệ hơn nữa, một lỗi sản phẩm thực sự không liên tục, xảy ra lỗi 20% thường sẽ xảy ra khi thử lại mà không được chú ý.

Sử dụng số lần thử với các quy tắc sau: giới hạn ở một hoặc hai lần, ghi lại mọi bài kiểm tra cần một lần thử và coi danh sách đó là danh sách việc cần làm của bạn. Thử nghiệm được báo cáo là “đã vượt qua khi thử lại” sẽ được coi là sự cố cần điều tra chứ không phải là thành công.

Một quy trình nhóm cho các bài kiểm tra không ổn định

  1. Đo lường. Theo dõi những thử nghiệm nào thất bại rồi chuyển tiếp cùng một cam kết. Nhiều công cụ CI và phóng viên thử nghiệm có thể cho thấy điều này.
  2. Cách ly. Chuyển một thử nghiệm không ổn định đã được xác nhận ra khỏi quá trình chặn để nó không làm gián đoạn mọi người nhưng vẫn tiếp tục chạy và theo dõi nó.
  3. Chỉ định chủ sở hữu và thời hạn. Việc cách ly không có thời hạn sẽ trở thành nghĩa địa.
  4. Sửa hoặc xóa. Nếu thử nghiệm không đáng sửa, hãy xóa thử nghiệm đó và kiểm tra xem phạm vi áp dụng của thử nghiệm đó có còn tồn tại ở nơi khác hay không.
  5. Ngăn chặn. Chạy thử nghiệm mới nhiều lần trước khi hợp nhất. Một bài kiểm tra thất bại một lần trong năm mươi lần chạy sẽ tốt hơn là bị phát hiện trong sáu tháng.

Hãy coi thử nghiệm không ổn định là một lỗi được ưu tiên chứ không phải là tiếng ồn xung quanh. Mức độ nghiêm trọng và mức độ ưu tiên cũng được áp dụng ở đây, như được đề cập trong mức độ nghiêm trọng so với mức độ ưu tiên. Nếu tình trạng không ổn định phổ biến, hãy đọc về lỗi tự động hóa thử nghiệm rộng hơn và xem xét liệu bạn có quá nhiều thử nghiệm ở cấp trình duyệt hay không.

Lời kết

Các bài kiểm tra không ổn định có vẻ ngẫu nhiên nhưng hiếm khi như vậy. Gần như mọi người đều đưa ra một giả định về thời gian, trật tự, dữ liệu hoặc môi trường không phải lúc nào cũng đúng. Chọn bài kiểm tra thường thất bại nhất trong quy trình của bạn trong tuần này. Chạy nó năm mươi lần, tìm ra giả định và sửa nó mãi mãi. Một bản sửa lỗi thực sự sẽ dạy cho một nhóm hơn một trăm lần chạy lại.

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

Kiểm tra không ổn định là gì?

Một thử nghiệm không ổn định sẽ vượt qua một số lần chạy và thất bại ở những lần chạy khác mà không có bất kỳ thay đổi nào trong mã. Nguyên nhân có thể nằm ở thử nghiệm, môi trường hoặc sản phẩm.

Điều gì gây ra các bài kiểm tra không ổn định?

Các nguyên nhân phổ biến nhất là giả định về thời gian, trạng thái chia sẻ giữa các lần kiểm tra, bộ chọn không ổn định, dịch vụ bên ngoài, xử lý ngày và sự khác biệt giữa CI và máy cục bộ.

Tôi có nên xóa các bài kiểm tra không ổn định?

Đầu tiên hãy cố gắng sửa chúng. Nếu một thử nghiệm có giá trị thấp và tốn kém để khắc phục thì việc xóa thử nghiệm đó cũng được, nhưng hãy đảm bảo phạm vi quan trọng của thử nghiệm đó tồn tại ở một nơi khác.

Tôi có nên tự động thử lại các bài kiểm tra thất bại không?

Là một mạng lưới an toàn hạn chế, đúng vậy, nhưng hãy ghi lại mỗi lần thử lại và điều tra nó. Chỉ thử lại sẽ che giấu vấn đề và có thể để các lỗi thực sự không liên tục tiếp cận quá trình sản xuất.

Làm cách nào để tìm thấy các bài kiểm tra không ổn định?

Tìm kiếm các thử nghiệm thất bại và vượt qua cùng một cam kết, sử dụng lịch sử CI hoặc công cụ báo cáo của bạn. Bạn cũng có thể chạy các bài kiểm tra nghi ngờ nhiều lần trong một vòng lặp.

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 →