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

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

Kiểm thử phần mềm

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

Một chứng minh hệ thống của bạn xử lý lưu lượng truy cập mà bạn mong đợi. Người còn lại tìm ra nơi nó bị hỏng và cách nó phục hồi. Tìm hiểu khi nào nên chạy từng cái, những con số nào đáng tin cậy và cách lên kế hoạch cho một bài kiểm tra đưa ra câu trả lời thực sự.

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

Điểm chính

  • Kiểm tra tải kiểm tra xem hệ thống có đáp ứng được mục tiêu trong lưu lượng truy cập dự kiến hay không.
  • Kiểm tra sức chịu đựng đẩy công suất vượt quá để tìm ra điểm đột phá và nghiên cứu khả năng phục hồi.
  • Các công cụ thường giống nhau. Điều khác biệt là mục tiêu và mô hình lưu lượng truy cập.
  • Đánh giá kết quả bằng các phần trăm như p95 và p99, vì mức trung bình có thể che giấu các vấn đề nghiêm trọng.

Ứng dụng của bạn hoạt động hoàn hảo với mười người dùng. Điều gì xảy ra vào ngày bán hàng với mười nghìn? Thử nghiệm tải và kiểm tra căng thẳng mô tả hai cách khác nhau để trả lời câu hỏi đó và việc trộn lẫn chúng sẽ dẫn đến các thử nghiệm không chứng minh được những gì bạn nghĩ.

Hướng dẫn này giải thích nội dung của từng loại, các loại xét nghiệm liên quan và cách đọc kết quả. Chúng tôi đã chạy phép tính phần trăm nhỏ bên dưới trên Python 3.13, với các số được mô phỏng. Các tập lệnh k6 là các ví dụ minh họa mà chúng tôi không thực thi và số lượng người dùng cũng như mục tiêu được phát minh ra, vì vậy hãy thay thế chúng bằng tập lệnh của riêng bạn. Chỉ chạy các thử nghiệm này đối với các hệ thống mà bạn sở hữu hoặc có quyền kiểm tra, vì lưu lượng truy cập lớn có thể giống như một cuộc tấn công và gây ra tình trạng ngừng hoạt động thực sự.

Câu trả lời ngắn gọn

Thử nghiệm tải hỏi: liệu chúng tôi có thể xử lý lưu lượng truy cập mà chúng tôi mong đợi và đạt được mục tiêu khi thực hiện việc đó không? Bài kiểm tra căng thẳng hỏi: chúng ta có thể mất bao nhiêu trước khi thất bại, chúng ta thất bại như thế nào và chúng ta phục hồi nhanh như thế nào?

Hãy nghĩ về một cây cầu. Kiểm tra tải trọng cho số lượng xe tải dự kiến ​​đi qua và xác nhận rằng nó ổn. Bài kiểm tra căng thẳng tiếp tục tăng thêm sức nặng để tìm hiểu giới hạn của nó và liệu nó có đưa ra cảnh báo trước hay không. May mắn thay, việc phá vỡ phần mềm lại rẻ hơn so với việc phá một cây cầu.

Kiểm tra tải và kiểm tra căng thẳng cạnh nhau

Khía cạnh Kiểm tra tải Kiểm tra căng thẳng
Câu hỏi chính Chúng ta có đạt được mục tiêu ở mức tải dự kiến không? Chúng ta phá vỡ ở đâu và như thế nào?
Mức độ giao thông Bình thường đến mức cao nhất dự kiến Vượt đỉnh dự kiến
mẫu Tăng tốc, giữ vững Tiếp tục tăng cho đến khi thất bại
Thất bại Một thử nghiệm thất bại Kết quả mong đợi
Số liệu chính Thời gian đáp ứng, thông lượng, lỗi Điểm dừng, chế độ lỗi, thời gian phục hồi
Thời gian điển hình Trước mỗi lần phát hành hoặc sự kiện lớn Sau khi hệ thống ổn định dưới tải
kết quả Vượt qua hoặc thất bại trước các mục tiêu Giới hạn dung lượng và danh sách điểm yếu

Kiểm tra tải là gì?

Kiểm tra tải mô phỏng lưu lượng truy cập thực tế mà bạn mong đợi và đo lường cách hệ thống hoạt động. Nó cần một mục tiêu để kiểm tra, ví dụ: “với 500 người dùng đồng thời, 95% yêu cầu thanh toán kết thúc trong vòng 800 mili giây, với dưới 1% lỗi”.

Đây là cách nó có thể trông giống như một tập lệnh k6. Các bài kiểm tra k6 được viết bằng JavaScript và thresholds biến mục tiêu của bạn thành kết quả đạt hoặc không đạt:

import http from "k6/http";
import { sleep } from "k6";

export const options = {
  stages: [
    { duration: "5m", target: 500 },   // ramp up
    { duration: "20m", target: 500 },  // hold at expected peak
    { duration: "2m", target: 0 },     // ramp down
  ],
  thresholds: {
    http_req_duration: ["p(95)<800"],
    http_req_failed: ["rate<0.01"],
  },
};

export default function () {
  http.get("https://staging.example.com/products");
  sleep(1);   // think time, as real users pause
}

sleep quan trọng. Không cần thời gian suy nghĩ, mỗi người dùng ảo sẽ truy cập máy chủ liên tục, tạo ra lưu lượng truy cập nhiều hơn so với cùng số lượng người thật.

Kiểm tra căng thẳng là gì?

Kiểm tra căng thẳng có chủ ý vượt quá mức mong đợi. Bạn không cố gắng vượt qua. Bạn muốn có câu trả lời cho những câu hỏi như:

  • Hiệu suất bắt đầu suy giảm ở mức độ nào?
  • Thành phần nào bị lỗi đầu tiên: cơ sở dữ liệu, máy chủ ứng dụng hoặc lệnh gọi của bên thứ ba?
  • Nó có bị lỗi với các lỗi rõ ràng hay bị treo và mất dữ liệu?
  • Nó có tự phục hồi khi lưu lượng truy cập giảm không?
export const options = {
  stages: [
    { duration: "5m", target: 500 },    // expected peak
    { duration: "5m", target: 1000 },   // beyond it
    { duration: "5m", target: 2000 },   // further
    { duration: "5m", target: 4000 },   // likely to break
    { duration: "10m", target: 0 },     // recovery: does it come back?
  ],
};

Giai đoạn phục hồi cuối cùng đó thường bị lãng quên và có thể là giai đoạn có giá trị nhất. Một hệ thống xử lý lỗi tốt nhưng không bao giờ phục hồi nếu không khởi động lại thủ công vẫn đồng nghĩa với việc mất điện để ai đó khắc phục vào lúc nửa đêm. Lý tưởng nhất là dưới mức tải cực lớn, hệ thống sẽ loại bỏ công việc một cách có kiểm soát, trả về 503 phản hồi rõ ràng thay vì hết thời gian chờ.

Spike, ngâm và các loại khác

Kiểm tra tải và căng thẳng thuộc nhóm kiểm tra hiệu suất rộng hơn:

Loại mẫu Những gì nó tìm thấy
Khói (hiệu suất) Một vài người dùng, một thời gian ngắn Liệu kịch bản và hệ thống có hoạt động hay không
Tải Đỉnh dự kiến, được tổ chức Liệu mục tiêu có được đáp ứng hay không
căng thẳng Tăng công suất quá khứ Giới hạn và chế độ thất bại
gai Nhảy đột ngột rồi rơi xuống Tự động chia tỷ lệ và hành vi xếp hàng
Ngâm (sức chịu đựng) Tải bình thường trong nhiều giờ Rò rỉ bộ nhớ, hết kết nối
công suất tăng dần Tải tối đa trong mục tiêu của bạn

Các bài kiểm tra Ngâm nắm bắt được các vấn đề mà các bài kiểm tra ngắn không bao giờ nhìn thấy. Một rò rỉ bộ nhớ nhỏ có thể trông vô hại trong 20 phút và chỉ khiến dịch vụ ngừng hoạt động sau hai ngày. Thử nghiệm tăng đột biến phù hợp với các sự kiện như bán hàng chớp nhoáng, nơi lưu lượng truy cập không tăng dần.

Số liệu quan trọng

Số liệu Ý nghĩa Theo dõi
Thời gian phản hồi (phần trăm) Yêu cầu mất bao lâu p95 và p99 đang tăng
Thông lượng Yêu cầu được xử lý mỗi giây Làm phẳng khi người dùng tăng lên
Tỷ lệ lỗi Tỷ lệ yêu cầu không thành công Bất kỳ sự gia tăng đột ngột
CPU và bộ nhớ Sử dụng tài nguyên máy chủ Bão hòa hoặc tăng trưởng ổn định
Cơ sở dữ liệu Truy vấn chậm, sử dụng nhóm kết nối Bể bơi cạn kiệt, khóa chờ
Độ sâu hàng đợi Công việc đang chờ xử lý Tăng trưởng không bao giờ cạn kiệt

Tại sao mức trung bình đánh lừa

Mức trung bình che giấu những yêu cầu chậm mà người thật phàn nàn. Để hiển thị điều này, chúng tôi đã tạo 100 thời gian phản hồi mô phỏng, trong đó 95 thời gian phản hồi nhanh (80 đến 200 mili giây) và 5 thời gian phản hồi rất chậm (2,5 đến 4 giây), sau đó tính toán số liệu thống kê chung:

import math, random, statistics

random.seed(3)
times = [random.randint(80, 200) for _ in range(95)] \
      + [random.randint(2500, 4000) for _ in range(5)]

def pct(values, p):
    values = sorted(values)
    return values[math.ceil(p / 100 * len(values)) - 1]

print("avg", round(statistics.mean(times)), "p50", pct(times, 50),
      "p95", pct(times, 95), "p99", pct(times, 99), "max", max(times))

# avg 302 p50 150 p95 199 p99 3740 max 3896

Hãy nhìn kỹ vào những con số đó. Trung bình 302 ms không mô tả được ai. Các yêu cầu thông thường mất khoảng 150 mili giây, trong khi các yêu cầu chậm mất hơn 3 giây. Ngay cả p95 trông vẫn ổn ở tốc độ 199 ms và chỉ p99 mới bộc lộ vấn đề. Một con số như p95 có nghĩa là 95% yêu cầu nhanh hoặc nhanh hơn.

Và một phần trăm yêu cầu không phải là một sự kiện hiếm gặp. Nếu một trang thực hiện 50 yêu cầu, tốc độ p99 chậm sẽ ảnh hưởng đến phần lớn lượt xem trang. Đặt mục tiêu theo phần trăm quan trọng đối với bạn và xem xét nhiều mục tiêu cùng nhau.

Mẹo: Hãy tìm “đầu gối” trong biểu đồ của bạn. Khi tải tăng, thời gian phản hồi không thay đổi trong một thời gian, sau đó đột ngột tăng lên, trong khi thông lượng ngừng tăng. Điểm đó chính là năng lực thực tế của bạn, và nó thường diễn ra tốt đẹp trước khi mọi thứ thực sự sụp đổ.

Công cụ

Công cụ Viết kịch bản Được biết đến với
k6 JavaScript Thân thiện với nhà phát triển, ngưỡng phù hợp với CI
JMeter GUI và XML Trưởng thành, hỗ trợ nhiều giao thức
Gatling Scala, Java, Kotlin và những thứ khác Dựa trên mã, hiệu quả
châu chấu Python Hành vi người dùng đơn giản, dựa trên Python

Bất kỳ trong số này có thể chạy cả kiểm tra tải và căng thẳng. Chọn một thứ phù hợp với kỹ năng của nhóm bạn thay vì chạy theo danh sách tính năng. Để sử dụng một trong quy trình của bạn, hãy xem CI/CD là gì.

Cách lập kế hoạch kiểm tra

  1. Đặt mục tiêu. Sử dụng số liệu phân tích thực tế để tìm lưu lượng truy cập cao nhất của bạn và xác định mục tiêu.
  2. Chọn hành trình. Lập mô hình hành vi thực tế của người dùng, chẳng hạn như duyệt qua, tìm kiếm và thanh toán, theo tỷ lệ thực tế. Chỉ nhấn vào trang chủ chứng tỏ ít.
  3. Sử dụng môi trường thực tế. Một máy chủ chạy thử nhỏ không thể dự đoán quá trình sản xuất. Lưu ý bất kỳ sự khác biệt.
  4. Chuẩn bị dữ liệu. Sử dụng khối lượng thực tế vì một truy vấn nhanh trên 100 hàng có thể thu thập dữ liệu trên 10 triệu.
  5. Cảnh báo mọi người. Hãy thông báo cho nhóm vận hành của bạn và bất kỳ bên thứ ba nào và đừng vô tình kiểm tra nhà cung cấp dịch vụ thanh toán. Mô phỏng các dịch vụ bên ngoài khi thích hợp.
  6. Bắt đầu từ quy mô nhỏ. Trước tiên hãy chạy thử nghiệm khói nhỏ để xác nhận rằng tập lệnh của bạn hoạt động.
  7. Giám sát mọi thứ. Nếu không có số liệu máy chủ, bạn sẽ thấy rằng tốc độ chậm lại chứ không phải tại sao.
  8. Lặp lại. Chạy lại sau mỗi lần sửa và giữ đường cơ sở để so sánh.

Đọc kết quả

Triệu chứng Nguyên nhân có thể
Phản hồi chậm nhưng CPU thấp Đang chờ trên cơ sở dữ liệu, khóa hoặc dịch vụ bên ngoài
CPU cơ sở dữ liệu cao Thiếu chỉ mục hoặc truy vấn không hiệu quả
Lỗi kết nối đột ngột Đã đạt đến giới hạn nhóm kết nối hoặc tệp
Trí nhớ tăng dần Rò rỉ hoặc bộ nhớ đệm không giới hạn
CPU máy phát tải ở mức cao Công cụ kiểm tra là nút thắt cổ chai, không phải hệ thống của bạn

Cơ sở dữ liệu là một nút thắt cổ chai phổ biến, vì vậy nếu truy vấn là vấn đề, hãy đọc hướng dẫn của chúng tôi về Tối ưu hóa truy vấn SQL. Hàng cuối cùng của bảng là một cái bẫy quan trọng: luôn kiểm tra tình trạng của máy tạo ra tải.

Những lỗi thường gặp

  • Gây nhầm lẫn cho người dùng với các yêu cầu. Hãy làm rõ liệu mục tiêu có nghĩa là người dùng đồng thời hay yêu cầu mỗi giây.
  • Bỏ qua thời gian suy nghĩ. Điều này làm tăng lưu lượng truy cập và đưa ra kết quả sai lệch.
  • Thử nghiệm quá muộn. Một tuần trước khi ra mắt sẽ không có thời gian để khắc phục các vấn đề về kiến ​​trúc.
  • Sử dụng một điểm cuối duy nhất. Lưu lượng truy cập thực kết hợp giữa đọc, ghi và tìm kiếm.
  • Bộ nhớ đệm ẩn mọi thứ. Các yêu cầu lặp lại giống hệt nhau chỉ có thể kiểm tra bộ nhớ đệm của bạn, vì vậy hãy thay đổi dữ liệu.
  • Thử nghiệm một lần. Hiệu suất thay đổi theo mỗi lần phát hành, vì vậy hãy chạy thử nghiệm thường xuyên.

Lời kết

Chạy thử nghiệm tải để xác nhận rằng bạn có thể xử lý lưu lượng truy cập mà bạn mong đợi và chạy thử nghiệm căng thẳng để tìm hiểu điều gì sẽ xảy ra khi bạn không thể. Bắt đầu từ việc nhỏ: chọn hành trình người dùng quan trọng nhất của bạn, đặt một mục tiêu rõ ràng và chạy thử nghiệm ngắn theo giai đoạn có bật tính năng giám sát. Lần chạy đầu tiên đó thường dạy cho bạn điều gì đó và bạn có thể xây dựng từ đó.

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

Sự khác biệt chính giữa kiểm tra tải và căng thẳng là gì?

Kiểm tra tải sẽ kiểm tra hành vi theo lưu lượng truy cập dự kiến ​​so với các mục tiêu đã đặt. Kiểm tra căng thẳng vượt quá khả năng tìm ra điểm đột phá và cách hệ thống phục hồi.

Tôi nên chạy thử nghiệm tải hay thử nghiệm căng thẳng trước?

Tải thử nghiệm đầu tiên. Sau khi hệ thống đáp ứng được mục tiêu về lưu lượng truy cập dự kiến, hãy chạy các bài kiểm tra căng thẳng để khám phá các giới hạn của nó. Kết quả căng thẳng có ý nghĩa rất nhỏ đối với một hệ thống không ổn định.

Sự khác biệt giữa bài kiểm tra căng thẳng và bài kiểm tra tăng đột biến là gì?

Stress test thường tăng tải từng bước cho đến khi thất bại. Thử nghiệm đột biến đột ngột nhảy lên mức cao để xem hệ thống đối phó với sự thay đổi đột ngột như thế nào.

Thời gian phản hồi p95 là gì?

Điều đó có nghĩa là 95% yêu cầu đã hoàn thành vào hoặc thấp hơn thời điểm đó. Nó mô tả trải nghiệm của hầu hết người dùng tốt hơn mức trung bình.

Tôi có thể chạy thử tải trên sản phẩm không?

Bạn có thể, nhưng cẩn thận, với sự cho phép, giám sát và cách ngăn chặn nhanh chóng. Hầu hết các nhóm đều bắt đầu với môi trường dàn dựng giống như môi trường sản xuất để giảm thiểu rủi ro cho người dùng thự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 →