Selenium vs Nhà viết kịch: Sự khác biệt chính, so sánh mã và lựa chọn nào
Selenium có hai thập kỷ lịch sử và một hệ sinh thái khổng lồ. Nhà viết kịch mới hơn và bao gồm nhiều thứ hơn. So sánh chúng về những vấn đề quan trọng hàng ngày, đọc một bài kiểm tra ở cả hai và tự tin quyết định.
- Selenium là thư viện tự động hóa trình duyệt hoàn thiện được xây dựng trên tiêu chuẩn W3C WebDriver.
- Playwright là một khung mới hơn có tính năng tự động chờ, theo dõi và chạy thử nghiệm.
- Đối với một dự án web mới, Playwright thường làm việc hiệu quả hơn.
- Selenium vẫn là một lựa chọn hợp lý cho các bộ ứng dụng lớn hiện có, nhu cầu ngôn ngữ rộng hơn và thử nghiệm trong các trình duyệt thực tế của nhà cung cấp.
Nếu bạn đang bắt đầu một dự án tự động hóa thử nghiệm, câu hỏi Selenium vs Playwright sẽ nhanh chóng xuất hiện. Kết quả tìm kiếm có thể khiến vấn đề nghe có vẻ như đã được giải quyết nhưng câu trả lời đúng sẽ phụ thuộc vào nhóm của bạn, các bài kiểm tra hiện tại của bạn và trình duyệt mà bạn phải hỗ trợ.
Hướng dẫn này so sánh chúng dựa trên những điều bạn thực sự sẽ cảm nhận được trong công việc hàng ngày. Các mẫu mã hiển thị kiểu điển hình của từng công cụ và chúng tôi không chạy chúng cho bài viết này. Chúng tôi cũng tránh trích dẫn phần trăm tốc độ vì các điểm chuẩn được công bố rất khác nhau và thường đến từ các nhà cung cấp. Đo lường trên ứng dụng của riêng bạn nếu tốc độ sẽ quyết định vấn đề.
Câu trả lời ngắn gọn
Chọn Playwright cho hầu hết các dự án thử nghiệm web mới, đặc biệt nếu nhóm của bạn có thể làm việc với JavaScript, TypeScript, Python, Java hoặc .NET. Bạn nhận được nhiều tính năng hơn và tốn ít thời gian hơn cho cơ sở hạ tầng cũng như tình trạng chờ đợi không ổn định.
Chọn Selenium nếu bạn đã có một bộ công cụ làm việc lớn, nếu bạn cần một ngôn ngữ mà Playwright không hỗ trợ chính thức như Ruby hoặc nếu bạn phải thử nghiệm trên các bản dựng và nền tảng trình duyệt thực có sẵn thông qua lưới Selenium hoặc đám mây thiết bị.
Selenium vs Nhà viết kịch cạnh nhau
| Khía cạnh | Selen | Nhà viết kịch |
|---|---|---|
| Phát hành lần đầu | 2004 | 2020, bởi Microsoft |
| Nó là gì | Thư viện tự động hóa trình duyệt | Framework, với trình chạy trong Node.js |
| Ngôn ngữ | Java, Python, C#, Ruby, JavaScript | Bản in, JavaScript, Python, Java, .NET |
| Trình duyệt | Chrome, Firefox, Edge, Safari | Crom, Firefox, WebKit |
| Đang chờ | Rõ ràng chờ bạn viết | Tự động chờ được tích hợp sẵn |
| Người chạy thử | Mang theo của riêng bạn, như pytest hoặc JUnit | Bao gồm cho Node.js, plugin pytest cho Python |
| Chạy song song | Lưới Selenium hoặc khung kiểm tra | Được tích hợp vào người chạy của nó |
| Gỡ lỗi | Nhật ký khung, ảnh chụp màn hình bạn thêm | Trình xem dấu vết, chế độ UI, codegen |
| Chế nhạo mạng | Hạn chế, thường có thêm công cụ | Được xây dựng trong |
| cộng đồng | Rất lớn và lâu đời | Lớn và phát triển nhanh chóng |
Kiến trúc: cách mỗi người nói chuyện với trình duyệt
Selenium gửi lệnh bằng giao thức W3C WebDriver, một tiêu chuẩn chính thức. Mã của bạn giao tiếp với trình điều khiển, chẳng hạn như ChromeDriver, trình điều khiển này điều khiển trình duyệt, với mỗi lệnh thường là một yêu cầu HTTP riêng biệt. Bởi vì các nhà cung cấp trình duyệt hỗ trợ tiêu chuẩn này nên nó có khả năng tương thích rộng rãi. Một giao thức mới hơn, WebDriver BiDi, đang bổ sung thêm giao tiếp hai chiều và truyền phát sự kiện vào tiêu chuẩn.
Playwright duy trì kết nối liên tục với trình duyệt và sử dụng các bản vá của Chrome, Firefox và WebKit. Vì kết nối là trực tiếp và hai chiều nên nó có thể phản ứng với các sự kiện của trình duyệt và mỗi thử nghiệm có thể chạy trong ngữ cảnh trình duyệt nhẹ của riêng nó. Đây là lý do tại sao hầu hết các so sánh đều đánh giá Playwright nhanh hơn, mặc dù khoảng cách thực tế phụ thuộc vào ứng dụng và bài kiểm tra của bạn.
Một thử nghiệm trong cả hai công cụ
Đây là bài kiểm tra đăng nhập tương tự, được viết bằng Python, dựa trên một trang web thực hành công cộng.
Selen
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def test_login(driver):
driver.get("https://the-internet.herokuapp.com/login")
driver.find_element(By.ID, "username").send_keys("tomsmith")
driver.find_element(By.ID, "password").send_keys("SuperSecretPassword!")
driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()
message = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "flash"))
)
assert "You logged into a secure area" in message.text
Bạn cũng cần một công cụ cố định để tạo và đóng trình điều khiển, như chúng tôi trình bày trong Hướng dẫn về Selenium Python.
Nhà viết kịch
from playwright.sync_api import Page, expect
def test_login(page: Page):
page.goto("https://the-internet.herokuapp.com/login")
page.get_by_label("Username").fill("tomsmith")
page.get_by_label("Password").fill("SuperSecretPassword!")
page.get_by_role("button", name="Login").click()
expect(page.locator("#flash")).to_contain_text("You logged into a secure area")
Điều này phụ thuộc vào plugin pytest-playwright, cung cấp bản cố định page. Nó ngắn hơn, chủ yếu là do tính năng chờ được tích hợp vào expect và vì các công cụ định vị như get_by_role mô tả trang theo cách người dùng nhìn thấy nó. Với Selenium, bạn có thể giảm đáng kể bản soạn sẵn này bằng các trình trợ giúp và Mô hình đối tượng trang mà chúng tôi khuyên dùng trong một trong hai công cụ.
Chờ đợi và kiểm tra không ổn định
Thời gian là nguyên nhân hàng đầu dẫn đến việc kiểm tra trình duyệt không ổn định và đó là điểm khác biệt lớn nhất của hai công cụ trong quá trình sử dụng hàng ngày.
Trong Selenium, bạn chịu trách nhiệm đồng bộ hóa. Việc chờ đợi rõ ràng hoạt động tốt, nhưng ai đó phải ghi nhớ chúng ở mọi nơi và các đội quên thường quay lại time.sleep. Hướng dẫn của chúng tôi về Selenium chờ giải thích cách thực hiện việc này một cách chính xác.
Trong Playwright, các hành động sẽ tự động kiểm tra xem một phần tử có hiển thị, ổn định, được bật và có thể nhận sự kiện trước khi hành động hay không. Các xác nhận đầu tiên trên web tiếp tục thử lại cho đến khi hết thời gian chờ. Bạn vẫn có thể viết các bài kiểm thử không ổn định, ví dụ như với dữ liệu kiểm thử kém, nhưng nguồn gốc chính của vấn đề được xử lý theo mặc định.
Trình duyệt và ngôn ngữ
Đây là nơi Selenium giữ được lợi thế thực sự. Bản dựng WebKit của Playwright gần giống với công cụ của Safari, nhưng nó không giống với Safari trên máy Mac hoặc iPhone. Nếu hành vi thực sự của Safari là quan trọng thì Selenium với SafariDriver hoặc đám mây thiết bị thực sẽ giúp bạn tiến gần hơn đến những gì người dùng thực sự chạy.
Tương tự, Playwright kiểm tra các phiên bản trình duyệt đi kèm của nó, mặc dù nó cũng có thể điều khiển các kênh Chrome và Edge đã cài đặt. Selenium điều khiển các trình duyệt bạn cài đặt, điều này sẽ hữu ích nếu bạn phải hỗ trợ các phiên bản cụ thể. Đối với các ứng dụng di động gốc, câu trả lời cũng không đầy đủ: Appium, được xây dựng trên khái niệm WebDriver, là công cụ thông thường.
Về ngôn ngữ, Selenium chính thức hỗ trợ Ruby và có lịch sử rất lâu đời trong các nhóm Java. Phiên bản Node.js của Playwright cũng có công cụ hoàn chỉnh nhất vì có trình chạy thử nghiệm đầy đủ. Các ngôn ngữ khác lấy thư viện cốt lõi và tích hợp với khung kiểm tra của riêng chúng.
Gỡ lỗi
Nhà viết kịch có một sự dẫn dắt rõ ràng ở đây. Trình xem dấu vết của nó ghi lại từng hành động, cùng với ảnh chụp nhanh DOM, lệnh gọi mạng và nhật ký bảng điều khiển, do đó bạn có thể xem qua quá trình chạy CI không thành công sau khi quá trình đó kết thúc. Chế độ giao diện người dùng và codegen của nó cũng giúp bạn viết bài kiểm thử nhanh hơn. Xem Hướng dẫn viết kịch dành cho người mới bắt đầu của chúng tôi để biết cách sử dụng chúng.
Với Selenium, bạn tự lắp ráp điều này, từ ảnh chụp màn hình về lỗi, nhật ký trình duyệt, video từ nhà cung cấp lưới và báo cáo từ khung kiểm tra của bạn. Nó hoạt động tốt và nhiều nhóm có thiết lập tuyệt vời nhưng cần nỗ lực để xây dựng.
Tính năng mạng và API
Nhà viết kịch có thể chặn và mô phỏng các yêu cầu mạng bằng một vài dòng mã, điều này rất hữu ích cho việc kiểm tra trạng thái lỗi:
page.route("**/api/orders", lambda route: route.fulfill(status=500))
Nó cũng bao gồm một ứng dụng khách yêu cầu API, vì vậy bạn có thể tạo dữ liệu thử nghiệm thông qua API trước khi điều khiển trình duyệt. Selenium 4 đã bổ sung một số tính năng mạng thông qua Giao thức DevTools của Chrome và BiDi, nhưng khả năng hỗ trợ và sự tiện lợi sẽ khác nhau tùy theo trình duyệt và ngôn ngữ. Nhiều người dùng Selenium thêm proxy hoặc thư viện HTTP riêng, như trong các công cụ thử nghiệm API.
Mẹo: Cho dù bạn chọn công cụ nào, hãy tập trung kiểm tra trình duyệt vào các hành trình quan trọng và đẩy chi tiết xuống các cấp thấp hơn. Một bộ nhỏ hơn quan trọng hơn một công cụ nhanh hơn. Xem các phương pháp hay nhất về thử nghiệm toàn diện của chúng tôi.
Chạy song song và quy mô
Người chạy của Playwright xử lý các công nhân song song và phân chia trên các máy CI bằng các tùy chọn đơn giản. Bối cảnh trình duyệt có giá thành rẻ nên việc cách ly không yêu cầu một trình duyệt hoàn toàn mới cho mỗi lần kiểm tra.
Selenium sử dụng Selenium Grid để phân phối các thử nghiệm trên các máy và phiên bản trình duyệt, đồng thời các khung thử nghiệm xử lý tính song song. Grid cần nhiều thứ để chạy hơn, nhưng nó đã được chứng minh ở quy mô rất lớn và nhiều đám mây thiết bị thương mại hỗ trợ trực tiếp cho nó.
Bạn có nên chuyển từ Selenium sang Playwright không?
Không tự động. Một bộ công cụ làm việc rất có giá trị và việc viết lại sẽ mất thời gian để thử nghiệm sản phẩm. Hãy hỏi những câu hỏi này trước:
- Có vấn đề nào có thể đo lường được không? Kiểm tra không ổn định hoặc gỡ lỗi chậm là những lý do chính đáng. “Nó mới hơn” thì không.
- Bộ này lớn bao nhiêu? Một trăm bài kiểm tra có thể được di chuyển. Mười nghìn là một dự án lớn.
- Các đối tượng trên trang của bạn có sạch sẽ không? Tính trừu tượng tốt giúp việc di chuyển trở nên rẻ hơn nhiều.
- Bạn có tin tưởng vào các tính năng dành riêng cho Selenium không? Trước tiên, hãy kiểm tra nhu cầu về lưới và thiết bị của bạn.
Nếu bạn di chuyển, hãy đi dần dần. Viết các bài kiểm thử mới trong Playwright, trước tiên hãy di chuyển các bài kiểm thử cũ nhất và chạy song song cả hai cho đến khi bộ phần mềm cũ đủ nhỏ để ngừng hoạt động. Không dịch các bài kiểm tra theo từng dòng vì điều đó sẽ chuyển sang chế độ ngủ và bộ định vị cũ. Hãy tránh những lỗi được đề cập trong lỗi tự động hóa thử nghiệm.
Cách chọn
| Tình huống của bạn | Lựa chọn hợp lý |
|---|---|
| Ứng dụng web mới, đội ngũ hiện đại | Nhà viết kịch |
| Bộ Selenium ổn định lớn | Ở lại với Selenium và cải thiện nó |
| Nhóm viết Ruby | Selen |
| Phạm vi bảo hiểm của Real Safari là rất quan trọng | Selenium hoặc đám mây thiết bị |
| Kiểm tra không ổn định và gỡ lỗi CI cứng | Hãy thử Playwright trên một phi công |
| Ứng dụng di động gốc | Appium |
Tốt nhất, hãy chạy một phi công ngắn. Tự động hóa ba hành trình khó xử nhất trong mỗi công cụ dựa trên ứng dụng của riêng bạn, trong CI của riêng bạn và so sánh mã, tốc độ cũng như mức độ dễ dàng mà bạn có thể gỡ lỗi khi gặp lỗi. Một tuần bằng chứng đánh bại bất kỳ bài viết so sánh nào, kể cả bài viết này. Nếu Cypress cũng nằm trong danh sách rút gọn của bạn, hãy đọc Playwright vs Cypress.
Lời kết
Nhà viết kịch thường là nơi dễ dàng hơn để bắt đầu và Selenium vẫn là một tiêu chuẩn đáng tin cậy với phạm vi tiếp cận rộng rãi. Cả hai đều không cứu được một bộ thử nghiệm được thiết kế kém. Chọn dựa trên những hạn chế thực sự của bạn, đầu tư vào bộ định vị ổn định và dữ liệu thử nghiệm tốt, đồng thời giữ cho bộ phần mềm của bạn tập trung vào những gì quan trọng nhất đối với người dùng của bạn.
Câu hỏi thường gặp
Nhà viết kịch có tốt hơn Selenium không?
Vâng, đối với nhiều dự án web mới, nhờ tính năng tự động chờ và công cụ tích hợp sẵn. Selenium có thể phù hợp hơn với các bộ ứng dụng hiện có, nhu cầu ngôn ngữ rộng hơn hoặc các trình duyệt thực cụ thể.
Nhà viết kịch có nhanh hơn Selenium không?
Nó thường được báo cáo là nhanh hơn vì kết nối trình duyệt liên tục và bối cảnh nhẹ. Sự khác biệt thực sự phụ thuộc vào ứng dụng của bạn, vì vậy hãy đo lường nó bằng các thử nghiệm của riêng bạn.
Selenium đã lỗi thời?
Không. Selenium được tích cực duy trì và xây dựng theo tiêu chuẩn W3C và nó vẫn được sử dụng rộng rãi. Selenium 4 và WebDriver BiDi tiếp tục hiện đại hóa nó.
Nhà viết kịch có thể thử nghiệm Safari thực sự không?
Nhà viết kịch thử nghiệm với bản dựng WebKit của riêng mình, gần giống với công cụ của Safari nhưng không giống hệt. Để biết hành vi thực của Safari hoặc iOS, hãy sử dụng thiết bị thực hoặc SafariDriver.
Người mới bắt đầu nên học Selenium hay Playwright?
Nhiều người mới bắt đầu thấy Playwright dễ bắt đầu hơn. Selenium vẫn xuất hiện trong nhiều danh sách việc làm, vì vậy hãy kiểm tra thị trường địa phương của bạn. Các khái niệm cốt lõi được chuyển giao giữa chú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 →