Mã kiểm tra vận chuyển. Tại sao không bạn?


17

Tôi muốn gửi mã kiểm tra cùng với một sản phẩm. Cụ thể, cung cấp tùy chọn để bất kỳ ai có bản sao chương trình của chúng tôi đều có thể nhấn nút "tự kiểm tra" hoặc vượt qua - tự kiểm tra trên dòng lệnh và chạy qua bộ đơn vị hoàn chỉnh | kiểm tra tích hợp.

Tôi chủ yếu muốn làm điều này để giúp gỡ lỗi các vấn đề được phát hiện trong trường, vì vậy khi có báo cáo lỗi đến từ người dùng cuối, có khả năng nó được hỗ trợ bởi "và cả ba thử nghiệm này đều thất bại trên máy của tôi". Tôi muốn người kiểm tra thủ công để có thể chạy thiết bị | kiểm tra tích hợp là tốt.

Tuy nhiên, thử nghiệm của nhóm tin rằng mã thử nghiệm không phải là mã sản xuất và do đó sẽ không được vận chuyển. Tôi thực sự không có được lập luận này, vì hầu hết các dự án nguồn mở đều gửi một bộ thử nghiệm. Nó dường như là bất thường trong phần mềm đóng.

Tôi muốn hỗ trợ bằng chứng hoặc giai thoại cho cả hai phía của cuộc tranh luận. Tôi đã đưa ra dự đoán tốt nhất của mình về trang web trao đổi ngăn xếp nào là phù hợp nhất, nhưng vui lòng cho tôi biết nếu điều này không đúng chỗ.


8
Tại sao một thử nghiệm đơn vị trong một chương trình nguồn đóng (hoặc một chương trình nguồn mở chưa được sửa đổi) sẽ thất bại? Nếu sản phẩm của bạn yêu cầu một số lượng lớn các sự cố thiết lập và thiết lập thường là nguồn gây ra lỗi, thì việc gửi một số ứng dụng "xác thực cấu hình của tôi" có thể thực hiện những việc như xác thực kết nối cơ sở dữ liệu, xác thực kết nối với bất kỳ dịch vụ bên ngoài nào khác mã của bạn phụ thuộc vào, v.v. Tuy nhiên, sẽ không có nghĩa khi một bài kiểm tra đơn vị thất bại, vì bạn đã xác thực rằng mã hoạt động.
Hang Justin


15
Tại sao một bài kiểm tra đơn vị thất bại trong lĩnh vực này? Tắt đầu tôi: Chương trình tham nhũng. Phần cứng lộn xộn. Điều kiện cuộc đua chúng tôi đã không nhìn thấy tại địa phương. Liên kết với một thư viện động khác nhau. Xung đột với phần mềm chống vi-rút hoặc hệ điều hành. Được sử dụng với phiên bản đáng ngạc nhiên của phần mềm liên quan do cập nhật không đầy đủ. Tương tác với các quá trình khác không hành xử như mong đợi. Có rất nhiều lý do tại sao các lỗi xuất hiện trên thực địa và rất nhiều trong số chúng có thể bị tấn công từ một bài kiểm tra đơn vị (đối với một định nghĩa về đơn vị)
Jon Chesterfield

7
@JonChesterfield: tạo một tính năng tự kiểm tra trong chương trình của bạn có lẽ là một điều tốt. Và nếu tính năng tự kiểm tra đó có thể sử dụng lại một phần mã từ các bài kiểm tra đơn vị của bạn, tại sao không? Nhưng một tính năng cũng như các bộ phận có thể tái sử dụng nên được phát triển với quan điểm "đó là mã sản xuất".
Doc Brown

2
@JonChesterfield Tôi gặp khó khăn khi hình dung một bài kiểm tra đơn vị thất bại trên hầu hết các nguyên nhân đó. Tuy nhiên, kiểm tra tích hợp là một vấn đề khác - tôi có thể thấy công đức trong việc vận chuyển chúng nếu nó có thể được thực hiện mà không cần quá nhiều thứ.
Loren Pechtel

Câu trả lời:


19

Đôi khi mã kiểm tra chứa các đoạn mã từ bên thứ ba, cả bên ngoài và bên trong công ty của bạn. Điều này xảy ra khi người dùng tập tin lỗi; các thử nghiệm của bạn (chẳng hạn như kiểm tra hồi quy) sau đó kết hợp mã do chúng cung cấp để sao chép. Thông thường, việc cấp phép các đoạn mã như vậy để tái tạo lỗi là không rõ ràng. Vì vậy, bạn nên nhận thức được các vấn đề sở hữu trí tuệ. Bạn không muốn gửi mã kiểm tra vô tình tiết lộ một số bí mật thương mại hoặc tài sản trí tuệ của một bộ phận khác trong công ty hoặc của các đối tác bên ngoài của bạn.

Một lưu ý khác, mã kiểm tra hiếm khi được tuân theo các tiêu chuẩn mã sản xuất: đánh giá mã không nhất thiết phải được thực hiện; Các tiêu chuẩn mã hóa không được thi hành, v.v. Điều này thật đáng tiếc, nhưng phổ biến và không nhất thiết phải phản ánh kém đối với nhóm thử nghiệm nếu họ không có mục tiêu đó tại thời điểm các thử nghiệm này được phát triển.

Mặt khác, nhiều bài kiểm tra chỉ đơn giản là xấu hổ và thậm chí không kiểm tra những gì một số người cho là đang kiểm tra. Đó là vấn đề khác ...

Cuối cùng, vì tất cả các yếu tố này, bạn có thể muốn phân loại các thử nghiệm của mình thành các thử nghiệm có thể được vận chuyển dưới dạng nguồn mở và những yếu tố đơn giản là không thể. (Bạn có thể muốn viết một số thử nghiệm tùy chỉnh với ý định vận chuyển chúng, từ từ di chuyển các thử nghiệm khác vào bộ đó.)


Vấn đề của bên thứ ba là một điểm thực sự tốt. Việc nhóm mã kiểm tra thành "hiển thị bên ngoài" và "có thể bí mật" sẽ dễ bị lỗi và chi phí đáng kể. Đó là khá nhiều một thỏa thuận phá vỡ tất cả, cảm ơn bạn.
Jon Chesterfield

Vâng, khó để làm sau khi thực tế. Tôi nghĩ bạn sẽ gặp nhiều may mắn hơn với nỗ lực tận tâm để phát triển các bài kiểm tra vận chuyển.
Erik Eidt

@ErikEidt: Tôi đã tự do đưa ra đề nghị loại bỏ "dưới dạng nguồn mở", bởi vì đó có lẽ không phải là điều mà OP có trong tâm trí - Tôi nghĩ rằng anh ấy muốn gửi các bài kiểm tra dưới dạng nguồn đóng.
Doc Brown

@DocBrown, tôi lấy quan điểm của bạn. Có lẽ là một vấn đề giải thích như OP đã đề cập đến "nguồn mở" ở đâu đó trong bài viết. Trong mọi trường hợp, chỉnh sửa của bạn tổng quát hóa điểm độc đáo.
Erik Eidt

18

Kiểm tra vận chuyển? Đúng. Đơn vị kiểm tra vận chuyển? Không.

Như bạn đã nói trong nhận xét, vấn đề bạn có thể gặp phải khi chạy sản phẩm trên máy khách sẽ bao gồm các vấn đề như liên kết với dll sai, nói chung đây không phải là điều mà một bài kiểm tra đơn vị sẽ nắm bắt (điều này chắc chắn sẽ chế nhạo dll để kiểm tra mã).

Bây giờ, vận chuyển một bộ kiểm thử tích hợp, gọi UI gọi logic gọi là dll ... sẽ hoạt động tốt hơn nhiều. Kiểm tra tích hợp có thể hiển thị các khía cạnh khác của cài đặt thất bại mà kiểm tra đơn vị sẽ không hiển thị. (ví dụ: sản phẩm hiện tại của tôi yêu cầu cài đặt codec k-lite, chúng tôi không được phép gói do cấp phép. Các thử nghiệm đơn vị có thể cho thấy mã của chúng tôi hoạt động tốt, nhưng vẫn không hoạt động để làm hài lòng khách hàng. Tương tự, cấu hình của codec có thể không hoạt động chính xác, các bài kiểm tra đơn vị cũng sẽ không hiển thị điều đó).

Vì vậy - gửi một số thử nghiệm tích hợp của bạn thay vào đó, đó sẽ chính xác là những gì bạn muốn cho một sản phẩm được cài đặt, tích hợp.


2

Tôi có thể hiểu mối quan tâm này một cách mạnh mẽ trong các lĩnh vực mà bạn đang bảo vệ từng inch phần cứng, như một công cụ trò chơi AAA thế hệ tiếp theo đa luồng sử dụng mọi lõi CPU, nội tại SIMD, GPU, GPGPU, v.v. trong khi cung cấp một nền tảng chéo sản phẩm.

Trong những trường hợp đó, cơn ác mộng tồi tệ nhất của bạn thường sẽ là những trường hợp mà các bài kiểm tra (đơn vị và tích hợp) của bạn sẽ vượt qua cho 5.000 máy / nền tảng khác nhau đầu tiên được thử nghiệm, nhưng không thành công trong lần thứ 5.001 do lỗi trình điều khiển cho mô hình GPU tối nghĩa. về điều này mang lại cho tôi sự rùng mình - bạn không thể kiểm tra hoặc thấy trước những điều này trước.

Đặc biệt, nếu bạn viết shader GPU, cuối cùng bạn có thể chơi xổ số ngược trong đó một nửa mã bạn viết sẽ gọi hành vi không xác định, vì có rất ít đảm bảo tiêu chuẩn di động được thực thi bởi tất cả các mô hình / trình điều khiển GPU có liên quan. Mặc dù ngày càng ít chơi trò quét mìn hơn, nhưng điều này sẽ mang đến cho mọi người một số ý tưởng: http://theorangeduck.com/page/writer-portable-opengl . Thử điều này vào cuối những năm 90 và đầu những năm 2000 thực sự khủng khiếp, và đó là tất cả các cách quét mìn.

Đối với các loại trường hợp này, bạn thường cần đội ngũ hơn 10.000 người thử nghiệm với phạm vi phần cứng và hệ điều hành thực sự rộng để thực sự củng cố sản phẩm và cảm thấy tự tin về nó trước khi phát hành ổn định. Không phải tất cả các công ty đều có đủ khả năng để có một cơ sở thử nghiệm rộng như vậy và không phải tất cả đều có kỷ luật để thực hiện đúng (tất cả các vấn đề đáng chú ý nên được khắc phục trước khi có quá nhiều người thử nghiệm trong một số giai đoạn tiền alpha / alpha nội bộ hoặc nếu không lũ báo cáo dư thừa có thể khiến các nhà phát triển rơi vào hoảng loạn vá lỗi và cầu nguyện).

Những gì tôi đề nghị trong trường hợp này là những gì người khác đề xuất, tập trung vào một bộ kiểm tra tích hợp phân tán. Bạn có thể gói nó với trình cài đặt, yêu cầu người dùng vượt qua kiểm tra chẩn đoán cơ bản với sự chú ý cẩn thận để cung cấp chi tiết về lý do tại sao cài đặt thất bại mà họ có thể chuyển cho bạn, các nhà phát triển.

Một điều nữa (nếu bạn có thể thuyết phục ông chủ) là có sẵn một loạt phần cứng để thực hiện tích hợp liền kề. Sự đa dạng hơn trong các combo phần cứng / hệ điều hành, merrier. Bạn muốn thậm chí một loạt các phần cứng tào lao mô hình các yêu cầu phần cứng tối thiểu cho các máy chủ CI của bạn: bạn không bao giờ biết.

Nhưng có một điều nữa tôi muốn đề xuất:

Ghi nhật ký

Nếu bạn đang đối phó với bất cứ điều gì như kịch bản mà tôi đã mô tả ở trên, thì thường thì bạn không thể kiểm tra những thứ có xu hướng rắc rối nhất (những vấn đề tồi tệ nhất có thể xuất hiện vào thời điểm tồi tệ nhất có thể xảy ra ngay cả bộ kiểm tra toàn diện nhất vì đây là một vấn đề bị ràng buộc với một bộ phần cứng / hệ điều hành rất cụ thể).

Tuy nhiên, hầu hết các loại vấn đề như không tương thích phần cứng tối nghĩa hoặc trình điều khiển hoàn toàn trục trặc hoặc liên kết với dylib sai (tôi chưa bao giờ thực sự phải đối mặt với mối quan tâm này) sẽ không giúp bạn vượt qua được phần mềm. Nó thường sẽ sụp đổ và cháy khá sớm, nói một cách thô lỗ.

Tôi đề nghị, vì lợi ích của sự tỉnh táo, để loại bỏ những điều không thể tránh khỏi. Bạn không thể làm bất cứ điều gì về những điều này mà bạn không thể kiểm tra toàn diện. Đừng cố gắng ngăn chặn cơn bão (không thể), nhưng hãy lên những cửa sổ đó.

Thông thường ở đây, điều tốt nhất chúng ta có thể làm là tìm ra vấn đề càng sớm càng tốt, nơi nó xảy ra càng chi tiết càng tốt (để thu hẹp danh sách nghi phạm của chúng ta) và khắc phục sự cố ASAP sau khi báo cáo.

Trong trường hợp này, đăng nhập có thể là một cứu cánh. Đối với các loại trường này, bạn có thể tạo các nhật ký kỹ thuật spam mà không ai từng đọc qua. Thường thì có liên quan chỉ là dòng cuối cùng được ghi trong nhật ký trước khi người dùng gặp sự cố do trục trặc trình điều khiển, ví dụ: Bạn có thể viết một quy trình bên ngoài hoặc móc để theo dõi sự cố và sau đó hiển thị dòng cuối cùng của nhật ký mà người dùng có thể sao chép và dán cho bạn, ví dụ ngoài một bãi chứa sự cố.

Vì điều này thường cần thông tin chi tiết và rất nhiều lĩnh vực dễ bị ảnh hưởng nhất trong mã đối với các vấn đề phần cứng / nền tảng / trình điều khiển này là rất quan trọng về hiệu năng, nên có vấn đề khó xử khi việc ghi nhật ký có thể xảy ra với tốc độ thường xuyên đến mức nó sẽ thực sự chậm xuống phần mềm.

Một mẹo hữu ích trong trường hợp này là dựa vào giả định rằng một cái gì đó được thực hiện một lần sẽ thực hiện thành công lần thứ hai, lần thứ ba, v.v. Đây không phải là giả định hợp lý nhất, nhưng nó thường "đủ tốt" (và tốt hơn vô cùng) . Cùng với đó, bạn có thể sử dụng một chút trạng thái bên ngoài để theo dõi khi nào một cái gì đó đã được ghi lại và bỏ qua các lần thử tiếp theo để đăng nhập cho các trường hợp thực sự chi tiết trong đó mã sẽ được gọi liên tục trong một vòng lặp.

Dù sao, tôi hy vọng điều này sẽ giúp. Tôi đã từng gặp phải loại cám dỗ này trong quá khứ và có một chút hoang tưởng xung quanh việc mã hóa GPU (GPGPU và shader) do một số kinh nghiệm trong quá khứ giữa tôi và nhóm của tôi (đôi khi chỉ cần thấy các thành viên khác trong nhóm đối phó với những điều này thực sự muộn và sau khi phát hành đã cho tôi các creep, như một số trục trặc ATI trên một mô hình Radeon cụ thể sẽ gặp sự cố khi kết xuất các dòng khử răng cưa, sau đó đã báo cáo và đánh dấu là một vấn đề đã biết chỉ có giải pháp khắc phục có sẵn).

Ghi nhật ký là thứ đã cứu những kẻ tàn phế của chúng ta ở đó, cho phép chúng ta thường thấy vấn đề trên máy nguyên mẫu tối thiểu 10,001 với GPU trên bo mạch mà chúng ta chưa từng nghe thấy, với dòng mã cuối cùng ngay lập tức cho chúng ta biết chính xác nơi thất bại xuống 2 hoặc 3 dòng mã là nghi ngờ, ví dụ: Nếu bên trong một trình tạo bóng phức tạp, chúng tôi thuộc loại SOL vì chúng tôi không thể đăng nhập vào trình tạo bóng GPU, nhưng ít nhất chúng tôi có thể sử dụng ghi nhật ký để xem trình tạo bóng nào có vấn đề ngay lập tức để bắt đầu điều tra.


2
Ghi nhớ mã đăng nhập là thông minh. Chúng tôi hiện không sản xuất nhật ký - phần lớn là do lo ngại về hiệu suất - vì vậy việc gỡ lỗi liên quan đến kết xuất cốt lõi. Nhúng các xét nghiệm chẩn đoán với trình cài đặt cũng là một ý tưởng tốt. Cảm ơn bạn đã trả lời chi tiết.
Jon Chesterfield
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.