Tại sao Cem Kaner coi một bài kiểm tra không tiết lộ lỗi là lãng phí thời gian?


15

Điều gì về việc xác nhận chức năng trong các thử nghiệm tích cực, chứng minh rằng nó đang hoạt động - tôi có nên nói rằng nó là một sự lãng phí thời gian? Những loại khái niệm đằng sau trích dẫn này?

Các xét nghiệm không thành công, tức là các xét nghiệm không tìm thấy lỗi là một sự lãng phí thời gian.

Kỹ thuật web: Kỷ luật phát triển hệ thống các ứng dụng web trích dẫn Cem Kaner .


2
Không hẳn vậy. Kaner tuyên bố rằng nói chung, kiểm tra chỉ nên tìm lỗi.
John V

4
Đó là một vị trí rất hàn lâm. Thỉnh thoảng ông Kaner và ông Schrödinger phải ngồi uống tách cà phê.
Blrfl

2
@Blrfl chỉ có vấn đề với điều đó là ông Schrödinger đã chết. Ôi, đợi đã ... ừm ...
ikmac

1
Câu nói đó không có ngữ cảnh nghe có vẻ điên rồ ...
Rig

1
Phần mềm xác nhận chức năng trong các bài kiểm tra tích cực. - Điều này về cơ bản là không thể. Bạn không thể chứng minh điều gì đó đúng, bạn chỉ có thể chứng minh nó sai.
Konrad Rudolph

Câu trả lời:


37

Tôi đã viết hầu hết các phần mềm máy tính thử nghiệm hơn 25 năm trước. Kể từ đó tôi đã chỉ ra một số phần của cuốn sách mà tôi cho là lỗi thời, hoặc đơn giản là sai. Xem http://www.kaner.com/pdfs/TheOng tiếnRevolution.pdf

Bạn có thể xem thêm (các chế độ xem hiện tại, nhưng không có con trỏ rõ ràng quay lại TCS) tại trang web của tôi cho Khóa học kiểm thử phần mềm Hộp đen (video và các slide có sẵn miễn phí), www.testingeducation.org/BBST

Văn hóa thử nghiệm trước đó phần lớn là xác nhận.

Trong thử nghiệm hiện đại, cách tiếp cận kiểm thử đơn vị phần lớn là xác nhận - chúng tôi viết các bộ sưu tập lớn các thử nghiệm tự động chỉ đơn giản xác minh rằng phần mềm tiếp tục hoạt động như dự định. Các thử nghiệm đóng vai trò là trình phát hiện thay đổi - nếu một cái gì đó trong các phần khác của mã và phần này hiện có vấn đề hoặc nếu các giá trị dữ liệu không thể có trong thế giới thực hiện đang tiếp cận ứng dụng, thì trình phát hiện thay đổi sẽ kích hoạt, cảnh báo lập trình cho một vấn đề bảo trì.

Tôi nghĩ rằng tư duy xác nhận là phù hợp để thử nghiệm đơn vị, nhưng hãy tưởng tượng một thế giới trong đó tất cả các thử nghiệm hệ thống là xác nhận (đối với những người phân biệt, vui lòng diễn giải "thử nghiệm tích hợp hệ thống" và "thử nghiệm chấp nhận" như trong các nhận xét của tôi về hệ thống thử nghiệm.) Quan điểm của thử nghiệm là xác nhận rằng chương trình đáp ứng các thông số kỹ thuật của nó và cách tiếp cận vượt trội là xây dựng một trăm (hoặc ít nhất vài trăm) thử nghiệm hồi quy cấp hệ thống, ánh xạ các phần của thông số kỹ thuật theo hành vi của chương trình. (Tôi nghĩ rằng xác nhận hành vi cụ thể là hữu ích, nhưng tôi nghĩ đó là một phần nhỏ của mục tiêu lớn hơn.)

Vẫn có những nhóm thử nghiệm hoạt động theo cách này, nhưng nó không còn là quan điểm thống trị nữa. Hồi đó, nó đã như vậy. Tôi đã viết một cách dứt khoát và vẽ ra những sự tương phản sắc nét để tạo điểm nhấn cho những người luôn được đào tạo về tư duy này. Ngày nay, một số tương phản sắc nét (bao gồm cả một trong những trích dẫn ở đây) đã lỗi thời. Họ bị hiểu sai là các cuộc tấn công vào các quan điểm sai lầm.

Như tôi thấy, kiểm thử phần mềm là một quá trình thực nghiệm để tìm hiểu thông tin liên quan đến chất lượng về một sản phẩm hoặc dịch vụ phần mềm.

Một bài kiểm tra nên được thiết kế để tiết lộ thông tin hữu ích.

Trước đó, nhân tiện, không ai nói về việc thử nghiệm như một phương pháp để tiết lộ "thông tin". Trước đó, kiểm tra là để (một số phiên bản ...) tìm lỗi hoặc cho (một số phiên bản ...) xác minh (kiểm tra) chương trình theo thông số kỹ thuật. Tôi không nghĩ rằng sự khẳng định rằng các bài kiểm tra là để tiết lộ thông tin hữu ích đã đi vào từ vựng kiểm tra cho đến thế kỷ này.

Hãy tưởng tượng kiểm tra đánh giá về giá trị thông tin của họ. Một bài kiểm tra rất có khả năng dạy cho chúng tôi điều gì đó mà chúng tôi không biết về phần mềm sẽ có giá trị thông tin rất cao. Một thử nghiệm rất có khả năng xác nhận một cái gì đó mà chúng tôi đã mong đợi và đã được chứng minh nhiều lần trước đó, sẽ có giá trị thông tin thấp. Một cách để ưu tiên kiểm tra là chạy thử nghiệm giá trị thông tin cao hơn trước khi kiểm tra giá trị thông tin thấp hơn.

Nếu tôi áp dụng quá mức ưu tiên này để nó thu hút sự chú ý của lập trình viên, người quản lý dự án hoặc người quản lý quy trình, người không biết gì về kiểm thử phần mềm, tôi sẽ nói "KIỂM TRA RATNG KHÔNG ĐƯỢC THIẾT KẾ ĐỂ KIẾM ĐƯỢC . " Đây không phải là một bản dịch hoàn hảo, nhưng đối với những độc giả không thể hoặc sẽ không hiểu bất kỳ sự tinh tế hay trình độ nào, điều đó sẽ gần như sẽ có.

Trước đó, và tôi thấy nó một lần nữa ở đây, một số người không hiểu thử nghiệm sẽ trả lời rằng một thử nghiệm được thiết kế để tìm các trường hợp góc là một sự lãng phí thời gian so với thử nghiệm sử dụng chính của một chức năng chính. Họ không hiểu hai điều. Đầu tiên, bằng cách người kiểm tra thời gian tìm thấy thời gian để kiểm tra các giá trị biên, việc sử dụng chính các chức năng chính đã được thực hiện nhiều lần. (Có, có những trường hợp ngoại lệ và hầu hết các nhóm kiểm tra sẽ chú ý cẩn thận đến những ngoại lệ đó.) Thứ hai, lý do để kiểm tra với các giá trị cực đoan là chương trình có nhiều khả năng thất bại với các giá trị cực đoan. Nếu nó không thất bại ở mức cực đoan, bạn kiểm tra một cái gì đó khác. Đây là một quy tắc hiệu quả. Mặt khác, nếu nó KHÔNG thất bại ở một giá trị cực đoan, người kiểm tra có thể dừng lại và báo cáo lỗi hoặc người kiểm tra có thể khắc phục sự cố thêm, để xem liệu chương trình có bị lỗi theo cùng một cách ở các giá trị bình thường hơn không. Ai thực hiện việc khắc phục sự cố đó (người kiểm tra hoặc lập trình viên) là vấn đề của văn hóa doanh nghiệp. Một số công ty dự trù thời gian của người kiểm tra cho việc này, một số ngân sách dành cho các lập trình viên và một số dự kiến ​​các lập trình viên sẽ sửa các lỗi trường hợp góc dù chúng có thể khái quát hóa hay không để việc khắc phục sự cố không liên quan. Sự hiểu lầm phổ biến - rằng người kiểm thử đang lãng phí thời gian (thay vì tối đa hóa hiệu quả) bằng cách kiểm tra các giá trị cực đoan là một lý do khác cho thấy "Một thử nghiệm không được thiết kế để phát hiện ra lỗi là lãng phí thời gian" là một thông điệp thích hợp cho người kiểm tra. Đó là một sự đối nghịch với sự khuyến khích từ một số lập trình viên để (không có hiệu lực) không bao giờ chạy các bài kiểm tra có thể thách thức chương trình. Thông điệp được đơn giản hóa, nhưng toàn bộ cuộc thảo luận là quá mức.

Nhân tiện, "giá trị thông tin" không thể là hệ thống ưu tiên duy nhất. Đó không phải là quy tắc của tôi khi tôi thiết kế các bộ thử nghiệm đơn vị. Đó không phải là quy tắc của tôi khi tôi thiết kế kiểm tra xác minh bản dựng (còn gọi là kiểm tra độ tỉnh táo). Trong cả hai trường hợp đó, tôi quan tâm đến các loại bảo hiểm hơn là sức mạnh của các thử nghiệm riêng lẻ. Có những trường hợp khác (ví dụ: các thử nghiệm tự động khối lượng lớn có giá rẻ để thiết lập, chạy và giám sát) trong đó sức mạnh của các thử nghiệm riêng lẻ đơn giản là không liên quan đến thiết kế của tôi. Tôi chắc rằng bạn có thể nghĩ về các ví dụ bổ sung.

Nhưng như một quy tắc chung, nếu tôi chỉ có thể nêu ra một quy tắc (ví dụ như nói với một giám đốc điều hành có đầu phát nổ nếu anh ta cố xử lý nhiều hơn một câu), thì việc kiểm tra giá trị thông tin thấp thường là lãng phí thời gian.


4
1 đã dành thời gian để trả lời một câu hỏi bạn những nguồn có thẩm quyền cho, cũng như xác nhận sử dụng của tôi về thuật ngữ "xây dựng thử nghiệm xác minh" mà rất nhiều người nhìn vào tôi buồn cười cho việc sử dụng ... Luôn luôn tốt đẹp để xem mọi người tầm vóc của bạn dành thời gian để giúp đỡ mọi người xung quanh đây
Jimmy Hoffa

1
Eric G: Tôi nghĩ rằng nếu bạn đọc lại rằng bạn sẽ thấy Cem nói rằng một phần của độc giả hiểu rằng quan điểm của anh ấy về chủ đề này đã phát triển theo thời gian. Hoặc bạn chỉ có thể tiếp tục và bỏ qua sự tinh tế và trình độ, để diễn giải Cem. (và tôi lấy "bằng cấp" không phải là thông tin của anh ấy, mà là ngoại lệ.)
Jim Holmes

Câu nói của bạn làm tôi nhớ đến một điều mà tôi đã quan sát về khoa học: người ta không thể chứng minh (hoặc thậm chí hỗ trợ một cách có ý nghĩa) một lý thuyết khoa học bằng cách thực hiện các thí nghiệm mà người ta kỳ vọng sẽ mang lại kết quả phù hợp với lý thuyết; cách để hỗ trợ một lý thuyết là nỗ lực thực sự cho các thí nghiệm thiết bị không hỗ trợ nó, nhưng không thể thực hiện được.
supercat

@supercat bạn có thể hỗ trợ một lý thuyết bằng một bài kiểm tra cho một điều gì đó phù hợp với lý thuyết nếu bài kiểm tra đó không xảy ra với bạn trước lý thuyết (ví dụ: cho thấy gia tốc của một vật rơi trong chân không giống như bạn tính toán nói nhiều hơn là cho thấy nó rơi xuống). Kiểm tra trường hợp cạnh là tương tự; Tôi có thể mong đợi phần mềm hoạt động chính xác khi xử lý các giá trị cực đoan, nhưng nó mang lại sự tin tưởng hơn về chất lượng để thấy điều đó xảy ra hơn là lặp lại các giá trị đầu vào mà nó có thể thấy trong quá trình phát triển, cùng với khả năng tìm thấy lỗi.
Jon Hanna

@JonHanna: Phrasing của tôi rất kém: vấn đề không phải là sự mong đợi, mà là nỗ lực. Người ta không thể chứng minh một lý thuyết bằng cách cố gắng tìm các bài kiểm tra mà nó sẽ vượt qua; người ta phải nỗ lực hết sức để tìm các bài kiểm tra mà nó sẽ thất bại nếu không hợp lệ.
supercat

11

Ý tưởng là, theo Kaner, "vì bạn sẽ hết thời gian trước khi hết các trường hợp thử nghiệm, điều cần thiết là sử dụng thời gian có sẵn một cách hiệu quả nhất có thể."

Khái niệm đằng sau trích dẫn mà bạn hỏi về được trình bày và giải thích chi tiết trong bài viết Phần mềm máy tính thử nghiệm của Cem Kaner , Jack Falk, Hung Quốc Nguyễn, trong chương "MỤC TIÊU VÀ GIỚI HẠN CỦA KIỂM TRA":

VẬY, TẠI SAO KIỂM TRA?

Bạn không thể tìm thấy tất cả các lỗi. Bạn không thể chứng minh chương trình chính xác và bạn không muốn. Nó đắt tiền, bực bội, và nó không thắng bạn trong bất kỳ cuộc thi nổi tiếng nào. Vì vậy, tại sao phải thử nghiệm?

MỤC ĐÍCH CỦA VIỆC KIỂM TRA CHƯƠNG TRÌNH LÀ TÌM KIẾM VẤN ĐỀ TRONG CNTT

Tìm kiếm vấn đề là cốt lõi của công việc của bạn. Bạn nên tìm càng nhiều càng tốt; vấn đề càng nghiêm trọng thì càng tốt.

Vì bạn sẽ hết thời gian trước khi hết các trường hợp thử nghiệm, điều cần thiết là sử dụng thời gian có sẵn một cách hiệu quả nhất có thể. Chương 7,8,12 và 13 xem xét các ưu tiên một cách chi tiết. Nguyên tắc hướng dẫn có thể được đặt đơn giản:


Một thử nghiệm cho thấy một vấn đề là một thành công. Một bài kiểm tra không tiết lộ vấn đề là một sự lãng phí thời gian.


Hãy xem xét sự tương tự sau đây, từ Myers (1979). Giả sử có gì đó không ổn với bạn. Bạn đi khám bác sĩ. Anh ta phải chạy thử nghiệm, tìm hiểu những gì sai và đề nghị hành động khắc phục. Anh ta chạy thử sau khi kiểm tra sau khi thử nghiệm. Cuối cùng, anh ta không thể tìm thấy điều gì sai. Anh ta là một người thử nghiệm tuyệt vời hay một nhà chẩn đoán bất tài? Nếu bạn thực sự bị bệnh, anh ta bất tài, và tất cả những bài kiểm tra đắt tiền đó là một sự lãng phí thời gian, tiền bạc và công sức. Trong phần mềm, bạn là bác sĩ chẩn đoán. Chương trình là bệnh nhân bị bệnh (chắc chắn) ...


Bạn thấy đấy, quan điểm trên là bạn nên ưu tiên kiểm tra một cách khôn ngoan. Việc kiểm tra dự kiến ​​sẽ mất một khoảng thời gian giới hạn và không thể kiểm tra mọi thứ trong thời gian đã định.

Hãy tưởng tượng rằng bạn đã dành một ngày (tuần, tháng) để chạy thử nghiệm, không tìm thấy lỗi nào và để một số lỗi xảy ra vì bạn không có thời gian để chạy thử nghiệm sẽ tiết lộ nó. Nếu điều này xảy ra, bạn không thể nói "đó không phải là lỗi của tôi vì tôi đang bận chạy các bài kiểm tra khác" để biện minh cho việc bỏ lỡ này - nếu bạn nói như vậy, bạn vẫn sẽ phải chịu trách nhiệm.

Bạn đã lãng phí thời gian để chạy các bài kiểm tra không tiết lộ lỗi và vì điều này, bạn đã bỏ lỡ một bài kiểm tra sẽ tìm thấy một lỗi.

(Trong trường hợp nếu bạn tự hỏi, lỡ như trên nói chung là không thể tránh khỏi cho dù bạn có cố gắng, và có rất nhiều cách để đối phó với những, nhưng điều đó sẽ có thêm một chủ đề cho một câu hỏi riêng biệt ... và có lẽ phù hợp hơn cho SQA. SE.)


12
Câu trả lời này thể hiện chính xác vị trí của anh ta, nhưng đáng để chỉ ra rằng nhiều người nghĩ rằng vị trí của anh ta là sai. Đưa ra lựa chọn giữa một thử nghiệm thể hiện chức năng quan trọng nhất trong ứng dụng hoạt động chính xác (thử nghiệm chấp nhận, nếu bạn muốn) và thử nghiệm tìm thấy một lỗi nhỏ (căn chỉnh bởi một pixel) trong một góc của ứng dụng hiếm khi được sử dụng, tôi biết tôi sẽ chọn trong thời gian giới hạn của tôi. Và đối với các bác sĩ tương tự: nếu tôi đi CHECKUP thay vì phản ứng với các triệu chứng, xác nhận tim là tốt, phổi là tốt, vv là kết quả tốt. Vì vậy, có.
Kate Gregory

@KateGregory Tôi đồng ý, tôi cũng nghĩ như vậy. Tôi chắc chắn thấy ý kiến ​​của mình sai, chúng tôi kiểm tra chủ yếu để thu thập thông tin ..
John V

2
@KateGregory đồng ý - Tôi không nghĩ rằng việc dán nhãn cho bất kỳ bài kiểm tra nào được thông qua là một sự lãng phí hoàn toàn chính xác. Mặc dù, tôi nghĩ rằng một điểm anh ấy đưa ra là vượt thời gian : nếu lỗi trượt qua thử nghiệm phát hành, QA sẽ cần một cái gì đó nhiều hơn "ồ nhưng chúng tôi đang bận chạy các thử nghiệm khác" để che lưng họ. Tôi đã từng trải qua điều này với tư cách là người thử nghiệm trong quá khứ và thấy rằng bây giờ tôi là một nhà phát triển và tôi không nghĩ nó sẽ biến mất
gnat 22/03/13

4

Chà, tôi không biết ông Caner, nhưng IMHO

kiểm tra không có khả năng tìm thấy lỗi

là một sự lãng phí thời gian Điều đó bao gồm cả tình huống mà bạn đã có một số bài kiểm tra (không quan trọng nếu chúng là tự động hoặc chỉ trong danh sách kiểm tra) và bạn thêm các bài kiểm tra mới xác thực về cơ bản giống như các trường hợp bạn đã có. Vì vậy, các bài kiểm tra mới của bạn sẽ không tìm thấy bất kỳ lỗi nào nhiều hơn các bài kiểm tra hiện có.

Một tình huống như vậy có thể xảy ra, ví dụ, nếu bạn chỉ thông qua một danh sách ngẫu nhiên - tôi cũng có thể nói "không suy nghĩ" (tha thứ cho tôi từ đó) - chọn các trường hợp kiểm tra tại chương trình của bạn, mà không cần suy nghĩ nếu họ kiểm tra trường hợp cạnh mới, tương đương mới các lớp dữ liệu đầu vào của bạn hoặc nếu chúng tăng độ bao phủ mã liên quan đến các bài kiểm tra đã được viết.


-1

Theo ý kiến ​​của tôi, trích dẫn này đề cập đến các bài kiểm tra quá chung chung hoặc không linh hoạt.

Nếu bạn thực hiện kiểm tra chức năng xác thực email và trong bài kiểm tra bạn chỉ cung cấp email hợp lệ, bài kiểm tra đó hoàn toàn vô dụng. Bạn sẽ phải kiểm tra chức năng này xem có "chuỗi" nào không rõ ràng, email không hợp lệ, email quá dài, ký tự unicode (áêñç ....)

Nếu bạn mã hóa một bài kiểm tra chỉ kiểm tra name@dom.com trả về true và name @ com trả về false, bài kiểm tra đó hoàn toàn không có bài kiểm tra nào.

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.