a

Câu hỏi Mã của tôi có thực sự không thể kiểm tra được đơn vị không?


Rất nhiều mã trong một dự án hiện tại liên quan trực tiếp đến việc hiển thị mọi thứ bằng cách sử dụng công cụ dựng hình 3D của bên thứ ba. Như vậy, thật dễ dàng để nói "đây là trường hợp đặc biệt, bạn không thể kiểm tra đơn vị đó". Nhưng tôi tự hỏi liệu đây có phải là lý do chính đáng hay không ... thật dễ dàng để nghĩ rằng "Tôi đặc biệt" nhưng hiếm khi xảy ra.

Có loại mã nào thực sự không phù hợp để thử nghiệm đơn vị không? Bằng cách thích hợp, tôi có nghĩa là "không cần phải mất nhiều thời gian để tìm ra cách viết bài kiểm tra hơn là nỗ lực" ... đối phó với một tấn toán học / kết xuất 3D có thể mất nhiều công sức để chứng minh đầu ra của một hàm là chính xác so với chỉ nhìn vào đồ họa trả lại.


18
2018-03-25 11:37


gốc


Trong thử nghiệm đơn vị, bạn không thực sự muốn thử nghiệm công cụ của bên thứ ba, nhưng đảm bảo rằng các giá trị bạn cung cấp cho nó là những gì bạn mong đợi. Vì vậy, miễn là giao diện cho động cơ là độc đáo mockable, bạn sẽ có thể kiểm tra mã của bạn khá dễ dàng mà không cần tính toán bất cứ điều gì. - Grzenio


Các câu trả lời:


Mã số trực tiếp liên quan đến việc hiển thị thông tin, tạo ra hình ảnh và thậm chí cả công cụ giao diện người dùng chung, đôi khi khó kiểm tra đơn vị.

Tuy nhiên hầu hết chỉ áp dụng cho cấp cao nhất của mã đó. Thông thường, 1-2 cuộc gọi phương thức bên dưới "bề mặt" là mã dễ dàng kiểm tra đơn vị.

Ví dụ, có thể không cần thiết để kiểm tra xem một số thông tin có được hoạt hình chính xác vào hộp thoại khi xác thực không thành công. Tuy nhiên, nó rất dễ dàng để kiểm tra nếu xác nhận sẽ thất bại cho bất kỳ đầu vào nhất định.

Đảm bảo cấu trúc mã của bạn theo cách mà diện tích bề mặt "không thể kiểm tra" được tách biệt khỏi thử nghiệm và viết các thử nghiệm mở rộng cho mã không phải bề mặt.


18
2018-03-25 11:43



Phần khó khăn để thử nghiệm với GUI là nhân rộng con người. Nếu một thử nghiệm liên quan đến các công cụ như "chọn đối tượng này và chọn mục trình đơn đó", thì bạn phải làm việc xung quanh nó như bạn nói hoặc nhận thư viện thử nghiệm mô phỏng tương tác của người dùng. - Mike DeSimone
Tôi phản đối dễ dàng kiểm tra đơn vị. - peterchen
@ peterchen: và chính xác thì phản đối của bạn là gì? Nó có thể giúp ích nếu tôi làm rõ: "... là mã có thể được viết theo cách dễ dàng kiểm tra đơn vị. " - Joachim Sauer
Có, âm thanh tốt hơn, nếu "có thể" được nhấn mạnh;) --- Tôi thấy "có thể được kiểm tra dễ dàng" là một trong nhiều áp lực trên mã. Như với hầu hết các áp lực khác, họ hợp tác trong một thời gian dài hướng tới cái được gọi là "mã tốt" - tuy nhiên, tại một thời điểm nào đó họ phân kỳ - và đột nhiên bạn có nửa tá mục tiêu kéo theo những hướng khác. - peterchen


Điểm kiểm thử đơn vị mã hiển thị của bạn không phải là để chứng minh rằng mã của bên thứ ba thực hiện điều đúng (đó là để thử nghiệm tích hợp và hồi quy). Vấn đề là để chứng minh rằng mã của bạn cung cấp đúng hướng dẫn cho mã của bên thứ ba. Nói cách khác, bạn chỉ phải kiểm soát đầu vào của lớp mã của bạn và xác minh đầu ra (mà sẽ trở thành đầu vào của trình kết xuất).

Tất nhiên, bạn có thể tạo phiên bản giả lập của trình kết xuất đồ họa ASCII giá rẻ hoặc thứ gì đó và sau đó xác minh đồ họa giả nếu bạn muốn và điều này làm cho thử nghiệm rõ ràng hơn nếu bạn muốn, nhưng không cần thiết cho thử nghiệm đơn vị của của bạn mã.


7
2018-03-25 11:47



Vấn đề với 3D là, hành vi của một phương pháp có thể là áp dụng các phép biến đổi phức tạp cho toàn bộ các điểm trong không gian ... biết chính xác đầu ra sẽ là gì không tầm thường. - Mr. Boy


Nếu bạn không thể phá vỡ mã của bạn thành các đơn vị, rất khó để kiểm tra đơn vị. Tôi đoán là nếu bạn có các chức năng nguyên tử 3D (nói dịch, xoay, và dự án một điểm) họ phải dễ dàng kiểm tra được - tạo ra một tập hợp các điểm kiểm tra và kiểm tra xem việc chuyển đổi có cần đến điểm cần thiết hay không. Nếu bạn chỉ có thể tiếp cận mã 3D thông qua API giới hạn, thì sẽ khó để kiểm tra. Xin vui lòng xem Bài viết của Misko Hevery Testability và hướng dẫn kiểm tra của mình.


3
2018-03-25 11:45





Nếu bạn có thể lấy hình ảnh được hiển thị, bạn có thể kiểm tra đơn vị đó.

Đơn giản chỉ cần hiển thị một số hình ảnh với codebase hiện tại, xem nếu chúng "nhìn đúng" (kiểm tra chúng xuống pixel nếu bạn phải), và lưu trữ chúng để so sánh. Kiểm tra đơn vị của bạn sau đó có thể so sánh với những hình ảnh được lưu trữ và xem kết quả là như nhau.

Điều này có đáng để giải quyết rắc rối hay không, đó là để bạn quyết định.


2
2018-03-25 11:43



Điều này chỉ hoạt động nếu có pixel-điểm ảnh "chính xácNếu các thay đổi màu sắc nhỏ không phù hợp, thì nó không thành công (hoặc khó kiểm tra hơn). - Joachim Sauer
Không nhiều lắm. Trong trường hợp đó, bạn có sự khác biệt và kiểm tra xem nó có dưới ngưỡng không. - Mike DeSimone
Trong thế giới 3D tuyệt vời, không phải mã của bạn là mã ... bạn có các trình tạo bóng GPU cũng là một phần tài sản nghệ thuật ... nếu một nghệ sĩ thay đổi bóng đổ, kết quả hiển thị có thể thay đổi rất nhiều (tương tự như CSS trong Zen garden) - Mr. Boy
@ John: Đó là sự thật. Cùng một nắm giữ cho kết cấu. Bạn có thể làm việc xung quanh điều đó bằng cách gán các shader giả và texture trong quá trình kiểm thử đơn vị. Một lần nữa, nó có thể hoặc có thể không có giá trị rắc rối. - Thomas
Tôi không thể tưởng tượng được rằng loại thử nghiệm nào có thể là bất cứ thứ gì ngoài một thời gian cực kỳ giòn. - Michael Borgwardt


Phân tích kết xuất thành các bước và kiểm tra bằng cách so sánh bộ đệm khung cho từng bước với một hình ảnh tốt đã biết.

Không có vấn đề gì bạn có, nó có thể được chia nhỏ thành những con số có thể so sánh được. Bí quyết thực sự là khi bạn havbe một số máy phát điện số ngẫu nhiên trong thuật toán, hoặc một số phần không xác định khác.

Với những thứ như dấu phẩy động, bạn có thể cần phải trừ dữ liệu được tạo ra khỏi dữ liệu dự kiến ​​và kiểm tra xem sự khác biệt có nhỏ hơn một số ngưỡng lỗi hay không.


1
2018-03-25 11:45



Bạn có thể giả lập trình tạo số ngẫu nhiên để tạo ra một kết quả xác định. - Mongus Pong


Tôi nghĩ đây là một câu hỏi hay. Tôi vật lộn với điều này tất cả các thời gian, và nó có vẻ như có một số loại mã phù hợp với mô hình thử nghiệm đơn vị và các loại khác mà không.

Những gì tôi xem xét rõ ràng đơn vị kiểm chứng là mã mà rõ ràng là có phòng bị sai. Ví dụ:

  • Mã để tính toán các hàm đại số toán học hoặc tuyến tính lông. Tôi luôn viết một hàm phụ trợ để kiểm tra câu trả lời và chạy nó một lần trong một thời gian.

  • Mã cấu trúc dữ liệu lông, với các tham chiếu chéo, các hướng dẫn, các con trỏ ngược và các phương thức để tăng dần tính nhất quán. Đây là những thực sự dễ dàng để phá vỡ, vì vậy các bài kiểm tra đơn vị là tốt cho thấy nếu họ bị hỏng.

Mặt khác, trong mã với dự phòng thấp, nếu mã biên dịch nó có thể không rõ ràng những gì đang sai thậm chí có nghĩa là. Ví dụ: tôi làm giao diện người dùng khá phức tạp bằng cách sử dụng hộp thoại độngvà không rõ phải làm gì. Tất cả các loại sự kiện như xử lý sự kiện, bố cục và hiển thị / ẩn / cập nhật các điều khiển có thể khiến cho mã này dễ bị lỗi chỉ được xử lý trong một lớp được xác minh rõ ràng bên dưới.

Các loại thử nghiệm tôi thấy mình cần nhiều hơn thử nghiệm đơn vị là thử nghiệm bảo hiểm. Tôi đã thử tất cả các tính năng và kết hợp các tính năng có thể có chưa? Vì đây là một không gian rất lớn và cấm viết các bài kiểm tra tự động để kiểm tra nó, tôi thường thấy mình làm bài kiểm tra monte-carlo, nơi các lựa chọn tính năng được chọn ngẫu nhiên và được gửi đến hệ thống. Sau đó kết quả được kiểm tra theo cách tự động và / hoặc thủ công.


1
2018-04-14 14:32





Vâng, bạn không thể đơn vị kiểm tra một số loại mã ngoại lệ nhưng khác hơn ...

Tôi đã có các xét nghiệm đơn vị thực sự cho một số mã có vẻ không thể thậm chí đính kèm một khai thác thử nghiệm và mã có vẻ như nó phải được đơn vị testable nhưng không phải là.

Một trong những cách bạn biết mã của bạn không phải là đơn vị có thể kiểm chứng là khi nó phụ thuộc vào đặc điểm vật lý của thiết bị mà nó chạy. Một loại mã không thể kiểm tra đơn vị khác là mã giao diện người dùng trực tiếp (và tôi tìm thấy nhiều ngắt trong mã giao diện người dùng trực tiếp).

Tôi cũng đã có một đoạn mã không thể kiểm tra đơn vị khổng lồ có các bài kiểm tra tích hợp thích hợp.


0
2018-04-14 15:17