Sự khác biệt giữa gỡ lỗi và thử nghiệm là gì?


10

Giới thiệu về Kiểm thử phần mềm (Ammann & Offutt) đề cập đến p.32 một mô hình trưởng thành thử nghiệm 5 cấp độ:

Cấp độ 0 Không có sự khác biệt giữa kiểm tra và gỡ lỗi.

Cấp độ 1 Mục đích của thử nghiệm là cho thấy phần mềm hoạt động.

Cấp độ 2 Mục đích của thử nghiệm là cho thấy phần mềm không hoạt động.

Cấp độ 3 Mục đích của thử nghiệm không phải là để chứng minh bất cứ điều gì cụ thể, mà là để giảm rủi ro khi sử dụng phần mềm.

Kiểm tra cấp độ 4 là một môn học tinh thần giúp tất cả các chuyên gia CNTT phát triển phần mềm chất lượng cao hơn.

Mặc dù họ không đi sâu vào chi tiết hơn nữa. Sự khác biệt giữa gỡ lỗi và thử nghiệm là gì?


1
Phần nào của trang wikipedia về Gỡ lỗi làm bạn bối rối? vi.wikipedia.org/wiki/Debugging Vui lòng gửi các cụm từ hoặc trích dẫn cụ thể mà bạn thấy khó hiểu.
S.Lott

4
Thời gian trung bình một lập trình viên dành thử nghiệm: 10 phút. Thời gian trung bình một lập trình viên dành để gỡ lỗi một cái gì đó anh ta nên thử nghiệm: 2,5 giờ.
Craige

1
Có ai thực sự cần phải chính thức hóa thử nghiệm không, khi 80% tất cả các cửa hàng không có thử nghiệm nào cả?
Công việc

@Craige: Việc kiểm tra thường mất hơn 10 phút. Nó thậm chí có thể mất nhiều thời gian hơn tổng thời gian gỡ lỗi. Tuy nhiên, thời gian dành cho thử nghiệm là chủ động (đạt được phạm vi bao phủ toàn diện, mặc dù chỉ có một vài phần trăm thử nghiệm cho thấy khuyết điểm), trong khi thời gian dành cho gỡ lỗi là phản ứng (lỗi nhảy vào lập trình viên vào thời điểm bất tiện nhất, đặt một chịu áp lực phải loại bỏ lỗi và cuối cùng đưa ra các lỗi bổ sung như là một phần của bản sửa lỗi.)
rwong

Câu trả lời:


20

Kiểm tra có nghĩa là tìm ra các khiếm khuyết trong mã, hoặc từ một góc độ khác, để chứng minh ở mức độ phù hợp (không bao giờ có thể là 100%) rằng chương trình thực hiện những gì nó phải làm. Nó có thể là thủ công hoặc tự động, và nó có nhiều loại khác nhau, như đơn vị, tích hợp, hệ thống / chấp nhận, căng thẳng, tải, ngâm, v.v.

Gỡ lỗi là quá trình tìm và loại bỏ một lỗi cụ thể khỏi chương trình. Nó luôn luôn là một quá trình thủ công, một lần, vì tất cả các lỗi là khác nhau.

Tôi đoán là tác giả có nghĩa là, ở Cấp độ 0, chỉ có các thử nghiệm thủ công được thực hiện, theo kiểu ad hoc, không có kế hoạch kiểm tra hoặc bất cứ điều gì để đảm bảo rằng người thử nghiệm thực sự kiểm tra kỹ tính năng đang thử nghiệm và các thử nghiệm có thể đáng tin cậy lặp đi lặp lại.


Lưu ý rằng trong bối cảnh này, một lỗi là một sự khác biệt giữa những gì chương trình dự định làm và những gì nó thực sự làm.

1
"Kiểm tra" đó là sự hiểu biết của tôi về Bài kiểm tra đơn vị. Gỡ lỗi, đặc biệt nếu đó là mã của riêng bạn, chỉ là bản dùng thử và lỗi.
ott--

4

Gỡ lỗi là một quá trình từng bước thủ công có liên quan, không có cấu trúc và không đáng tin cậy. Bằng cách kiểm tra thông qua gỡ lỗi, bạn tạo ra các kịch bản không thể lặp lại do đó vô dụng để kiểm tra hồi quy. Tất cả các cấp độ khác 0 (trong ví dụ của bạn) loại trừ gỡ lỗi theo quan điểm của tôi vì lý do chính xác này.


Các Saff Squeeze là một kỹ thuật gỡ lỗi đó là rất có cấu trúc, rất đáng tin cậy, không đặc biệt liên quan và hình dung ít nhất một phần automatable. Nó đạt được điều này bằng cách nhận ra rằng trên thực tế, không có sự khác biệt giữa thử nghiệm và gỡ lỗi.
Jörg W Mittag

Nếu bạn gỡ lỗi là "không có cấu trúc, không đáng tin cậy và thủ công" thì bạn không làm đúng! Hoặc rõ ràng chúng ta chỉ sử dụng hai từ này để chỉ những thứ khác nhau.
MemeDeveloper

3

Gỡ lỗi là một nỗ lực để khắc phục các sự cố đã biết và chưa biết bằng phương pháp đi qua mã. Khi bạn gỡ lỗi, bạn thường không tập trung vào toàn bộ mã và hầu như bạn luôn làm việc trong phần phụ trợ, trong mã thực tế.

Kiểm thử là một nỗ lực để tạo ra một vấn đề thông qua nhiều cách sử dụng mã mà sau đó có thể được gỡ lỗi. Nó hầu như luôn được thực hiện trong không gian người dùng, nơi bạn đang chạy mã với tư cách là người dùng cuối sẽ chạy nó và cố gắng làm cho nó bị hỏng.


1
Tôi đồng ý và tôi muốn nhấn mạnh quan điểm của bạn về việc "chạy mã với tư cách là người dùng cuối sẽ chạy nó" chỉ để làm nổi bật sự nhấn mạnh quá mức mà mọi người có xu hướng đưa vào thử nghiệm tự động và TDD. Riêng đối với các ứng dụng dựa trên web - những gì nhiều thông tin hơn, mã kiểm tra mã hoặc những người kiểm tra các trang web?
MemeDeveloper

2

Nói một cách đơn giản, một "lỗi" được cho là đã xảy ra khi chương trình của bạn, khi thực thi, không hoạt động theo cách nó nên. Đó là nó không tạo ra kết quả hoặc kết quả mong đợi. Bất kỳ nỗ lực nào để tìm nguồn gốc của lỗi này, tìm cách sửa hành vi và thay đổi mã hoặc cấu hình để sửa lỗi có thể được gọi là gỡ lỗi.

Kiểm tra là nơi bạn đảm bảo chương trình hoặc mã hoạt động chính xác và theo cách mạnh mẽ trong các điều kiện khác nhau: Bạn "kiểm tra" mã của mình bằng cách cung cấp đầu vào, đầu vào đúng tiêu chuẩn, đầu vào sai, giá trị biên, môi trường thay đổi (HĐH, tệp cấu hình) . Về cơ bản, chúng tôi có thể nói rằng bạn cố gắng khám phá các lỗi và cuối cùng "gỡ lỗi" chúng trong quá trình thử nghiệm. Mong rằng sẽ giúp.


1

Không có gì cả. Nếu bạn làm đúng:

Lượt 'em cao, nhấn' em thấp :

Kiểm tra hồi quy và Saff Bóp

Kent Beck, Học viện Three Rivers

Tóm tắt: Để cách ly một cách hiệu quả một khiếm khuyết, hãy bắt đầu với một bài kiểm tra ở cấp độ hệ thống và tiến hành nội tuyến và cắt tỉa cho đến khi bạn có bài kiểm tra nhỏ nhất có thể chứng minh được lỗi đó.


Trong một số hệ thống - ví dụ như Smalltalk - không có sự khác biệt nào cả, bởi vì bạn có thể thực hiện chu trình viết-test / run-test / write-code hoàn toàn trong trình gỡ lỗi của mình.
Frank Shearar

@FrankShearar: Có lẽ không phải ngẫu nhiên mà bài báo trên được viết bởi một Smalltalker cũ. Chu trình TDD (tất nhiên cũng là của Kent Beck) về cơ bản là một mô tả về cách viết mã Smalltalk kể từ buổi bình minh: viết một số mã ví dụ trong không gian làm việc, để trình gỡ lỗi bắt không có ngoại lệ phương thức, nhấp vào tạo phương thức , viết mã, tiếp tục thực hiện (yay cho các trường hợp ngoại lệ có thể tiếp tục!), lặp lại.
Jörg W Mittag

1

Kiểm tra là một đặc quyền bạn thích trước khi phát hành cho khách hàng.

Lỗi là một cơn ác mộng bạn chịu đựng sau khi phát hành cho khách hàng.


haha Phản hồi thực tế / thực tế nhất ... nếu tôi có thể bỏ phiếu x 100.
MemeDeveloper

1

Những người khác đã đề cập đến sự khác biệt giữa thử nghiệm và gỡ lỗi.

Tôi muốn nhấn mạnh một phần chung . Khi một người kiểm tra tìm thấy một khiếm khuyết, nó phải được cách ly. Gỡ lỗi là một trong những kỹ thuật để cô lập vấn đề và tìm ra nguyên nhân gốc bằng cách phân tích trạng thái ứng dụng và mã của nó khi chạy. Trên thực tế, gỡ lỗi được Oxford Từ điển định nghĩa là "quá trình xác định và loại bỏ lỗi khỏi phần cứng hoặc phần mềm máy tính".

Ai sẽ cô lập (hoặc gỡ lỗi cụ thể) một khiếm khuyết, cho dù đó sẽ là người thử nghiệm hay nhà phát triển, là một câu hỏi phụ.


0

Mô hình trưởng thành thử nghiệm mà bạn đã liệt kê là những mô tả về tâm lý của nhóm phát triển.

Những gì danh sách ngụ ý, mà không nói rõ ràng, là sự thay đổi trong tâm lý ảnh hưởng đến cách tiến hành thử nghiệm.

Khi một nhóm phát triển tiến lên cấp độ tiếp theo, phạm vi thử nghiệm được mở rộng.

Ở cấp độ 0, không có thử nghiệm nào được thực hiện, bởi vì nhóm nghĩ rằng nó không cần thiết.

Ở cấp độ 1, thử nghiệm được thực hiện để cung cấp phạm vi bảo hiểm danh nghĩa của các chức năng cơ bản.

Ở Cấp độ 2, thử nghiệm được mở rộng để bao gồm mọi thứ ở Cấp độ 1 và thêm vào thử nghiệm phá hủy (một nhóm thử nghiệm chuyên dụng có quyền truy cập vào tất cả thông tin mà nhà phát triển có quyền truy cập, bao gồm mã nguồn và nhị phân, và cố gắng tìm các lỗi có thể xảy ra được kích hoạt từ vai trò người dùng)

Ở Cấp độ 3, ngoài mọi thứ ở Cấp độ 1-2, thử nghiệm không dựa trên chức năng / thử nghiệm không dựa trên tính chính xác (như đặc tính hiệu suất) được thêm vào.

Ở cấp độ 4, các mục tiêu của kiểm thử phần mềm được mọi người hiểu rõ, bao gồm cả nhân viên CNTT đối mặt với khách hàng. Do đó, nhân viên CNTT sẽ có thể cung cấp phản hồi về những kịch bản cần kiểm tra, cải thiện mức độ rủi ro của Cấp độ 4.

(Tuyên bố miễn trừ trách nhiệm: Tôi không có quyền truy cập vào sách giáo khoa, do đó thuật ngữ của tôi có thể không chính xác.)


0

Lỗi là lỗi có thể nhìn thấy. Gỡ lỗi là quá trình bắt đầu sau khi thiết kế trường hợp thử nghiệm. Đây là một nhiệm vụ khó khăn hơn so với kiểm tra, bởi vì trong quá trình gỡ lỗi, chúng ta cần tìm ra nguồn gốc của lỗi và loại bỏ nó, vì vậy đôi khi việc gỡ lỗi làm người dùng thất vọng.


0

Nói theo cách hàng ngày, thực tế, tôi nghĩ rằng nó hoàn toàn phụ thuộc vào bối cảnh .

Trong một nhóm lớn, làm việc theo tiêu chuẩn cao / rất cao (nghĩ rằng ngân hàng, quân sự, quy mô lớn, ngân sách cao hoặc hệ thống quan trọng trong kinh doanh) thì tôi nghĩ rõ ràng "gỡ lỗi" phải là "kết quả của thử nghiệm" , và chúng rõ ràng những điều rất khác nhau . Thử nghiệm lý tưởng dẫn đến gỡ lỗi (trong môi trường dàn dựng) và trong sản xuất, chúng ta cần gần bằng không.

Kiểm tra có phạm vi rộng, thường xuyên và rất chính thức - trong khi gỡ lỗi là một quá trình cụ thể đôi khi xảy ra khi cần khắc phục một lỗi cụ thể - điều này không rõ ràng và cần phải điều tra sâu hơn về hoạt động và kết quả đầu ra của hệ thống.

Ở đây trong tâm trí tôi kiểm tra là một cái gì đó thiết yếu, trong khi gỡ lỗi là một công cụ cụ thể chỉ cần thiết khi độ phân giải cho một lỗi là mờ đục.

Tôi hoàn toàn hiểu tiện ích rõ ràng trong TDD cho các nhóm và hệ thống lớn hơn là không thể đủ khả năng để trở thành "lỗi". Nó cũng rõ ràng rất có ý nghĩa đối với các hệ thống phức tạp (thường là "back-end") hoặc nếu có tỷ lệ phức tạp cao trong mã so với đầu ra. Sau đó, "thử nghiệm" có một cơ hội thực tế để thông báo khi nào và tại sao thất bại xảy ra. Các hệ thống thực hiện nhiều công việc phức tạp và hoặc dẫn đến kết quả đầu ra có thể đo lường rõ ràng thường dễ kiểm tra và do đó kiểm tra khác với gỡ lỗi. Trong các trường hợp này, kiểm tra ngụ ý mạnh mẽ một phương pháp dựa trên thủ tục, chính thức xác nhận hoặc không xác nhận sự phù hợp của kỳ vọng và sản lượng thực tế. Kiểm tra xảy ra mọi lúc, và đôi khi thông báo cho chúng tôi về nhu cầu gỡ lỗi.

Sẽ thật đáng yêu nếu đây là một sự thật có mặt ở khắp nơi, tôi sẽ thích nó nếu chu kỳ dev của tôi được phân định bởi đầu ra nhị phân được xác định rõ ràng (đỏ, xanh lục) nhưng ...

Trong trường hợp của tôi (được thừa nhận cụ thể - hoạt động solo 98% trên các hệ thống quản trị doanh nghiệp tập trung vào dữ liệu cỡ nhỏ, được tài trợ dưới mức trung bình) Tôi thực sự không thể thấy TDD có thể giúp tôi như thế nào. Hay đúng hơn là "gỡ lỗi" và "thử nghiệm" hầu như giống nhau.

Chủ yếu mặc dù việc sử dụng thuật ngữ "thử nghiệm" ngụ ý / liên quan chặt chẽ đến phương pháp luận của TDD.

Tôi biết đây là một người hoàn toàn, hoàn toàn không theo chủ nghĩa Zeitge "trốn tránh người không tin, trốn tránh, trốn tránh", điều đáng khinh bỉ không đáng nói. Nhưng nghĩ về bối cảnh của tôi, với một chiếc mũ thực tế, tôi thậm chí không mơ hồ, trong trí tưởng tượng điên rồ nhất của tôi, xem TDD có thể giúp tôi mang lại nhiều giá trị như thế nào cho khách hàng của mình.

Hay đúng hơn, tôi hoàn toàn không đồng ý với giả định chung rằng "thử nghiệm" là một quy trình dựa trên mã chính thức.

Phản đối cơ bản của tôi (áp dụng trong ngữ cảnh * cụ thể *) của tôi là ...

Nếu tôi không thể viết mã hoạt động một cách đáng tin cậy - thì làm thế quái nào tôi có thể viết mã hoạt động đáng tin cậy để kiểm tra có lẽ là mã tiêu chuẩn phụ.

Đối với tôi, tôi chưa bao giờ thấy bất kỳ ví dụ nào cũng như lập luận rằng (trong ngữ cảnh cụ thể của tôi) đã khiến tôi cảm thấy đủ để thậm chí bận tâm suy nghĩ về việc viết một bài kiểm tra , tôi có thể viết một số mã kiểm tra đáng kinh ngạc ngay bây giờ, có thể "kho lưu trữ của tôi có trả về Người dùng không thực thể có Tên == X, khi tôi hỏi chính xác - và chỉ - đó? ", nhưng có lẽ có nhiều tiện ích hơn trong tôi khi viết luồng này, có lẽ là internet-thực sự-chỉ là thuần túy-ngu ngốc-phun ra- rác rưởi tự mãn-hoang dã-dưới-thông tin-sôi sục-lãng phí-ngớ ngẩn, nhưng tôi chỉ cảm thấy cần phải chơi trò bênh vực của quỷ ở đây. (Loại hy vọng ai đó sẽ cho tôi thấy ánh sáng và chuyển đổi tôi, có thể điều này sẽ mang lại cho khách hàng của tôi giá trị tốt hơn cho tiền?).

Đôi khi "gỡ lỗi" có thể giống như "thử nghiệm". Điều này thực sự có nghĩa là trong cuộc sống làm việc hàng ngày của tôi, tôi dành ít nhất một phần ba thời gian để chơi với phiên bản địa phương của hệ thống của mình trong các trình duyệt khác nhau, cố gắng hết sức để thử nhiều thứ khác nhau trong nỗ lực phá vỡ công việc của tôi và sau đó điều tra những lý do tại sao nó thất bại và sửa chúng.

Tôi đồng ý 100% với tiện ích rõ ràng trong câu thần chú TDD "đỏ / xanh / tái cấu trúc", nhưng đối với tôi (làm việc trong ngân sách trung bình thấp, solo RIA đất) tôi thực sự rất thích cho ai đó làm ơn chỉ cho tôi cách tôi có thể có thể , về mặt logicthực tế nhận được bất kỳ giá trị bổ sung nào từ việc viết nhiều hơn ( giống như mã kiểm tra có khả năng bị lỗi ) so với tôi thực sự tương tác với đầu ra đầy đủ (và về cơ bản) của những nỗ lực của tôi mà chủ yếu liên quan đến tương tác thực sự của con người.

Đối với tôi khi các nhà phát triển nói về "thử nghiệm", nó thường bao hàm TDD.

Tôi cố gắng viết mã như thể có các thử nghiệm, tôi nghĩ rằng tất cả các mô hình / thực tiễn và xu hướng mà tất cả sự phát triển tập trung vào thử nghiệm này đã khuyến khích là tuyệt vời và đẹp đẽ, nhưng đối với tôi, "thử nghiệm" trong thế giới nhỏ bé của tôi không phải là viết nhiều mã hơn thử nghiệm thế giới thực đưa ra nó theo cách tiếp cận thực tế và gần giống như gỡ lỗi, hay đúng hơn là thay đổi tích cực ở đây là "gỡ lỗi", là kết quả trực tiếp của "thử nghiệm" không tự động lấy con người làm trung tâm. Điều này trái ngược với quan điểm được chấp nhận chung về "thử nghiệm" là một cái gì đó tự động và chính thức, và "gỡ lỗi" như một thứ gì đó của con người và đặc biệt hoặc không có cấu trúc.

Nếu mục tiêu thực sự đáng giá tiền / công sức và bạn đang tạo ra các ứng dụng tương tác dựa trên web, thì đầu ra của nỗ lực là các trang web và về cơ bản là cách chúng phản ứng với đầu vào của con người - vì vậy "thử nghiệm" đạt được tốt nhất bằng cách thử nghiệm những trang web đó, thông qua tương tác thực sự của con người. Khi sự tương tác này dẫn đến đầu ra bất ngờ hoặc không mong muốn, thì "gỡ lỗi" xảy ra. Gỡ lỗi cũng liên quan chặt chẽ đến ý tưởng kiểm tra thời gian thực của trạng thái chương trình. Kiểm tra thường liên quan đến tự động hóa mà tôi nghĩ thường là một hiệp hội không may.

Nếu mục tiêu thực sự có giá trị cho nỗ lực và thử nghiệm tự động là hiệu quả và mang lại lợi ích cao, trong khi gỡ lỗi chỉ là đầu ra của thử nghiệm đó hoặc là sự thay thế kém cho thử nghiệm tự động, thì tại sao trang web được truy cập nhiều thứ hai trên thế giới (Facebook ) vì vậy thường bị đánh đố với lỗi rõ ràng (đối với người dùng, nhưng rõ ràng không phải là nhóm thử nghiệm và mã kiểm tra) lỗi?

Có lẽ bởi vì họ đang tập trung vào đèn xanh trấn an và quên sử dụng kết quả đầu ra của công việc?

Có quá nhiều nhà phát triển nghĩ rằng thử nghiệm là thứ bạn làm với mã và gỡ lỗi là thứ bạn thỉnh thoảng làm với IDE vì một biểu tượng chuyển sang màu đỏ và bạn không thể giải quyết được tại sao? Tôi nghĩ rằng những từ này có những đánh giá giá trị đáng tiếc liên quan đến chúng, thường làm lu mờ thực tế thực tế của những gì chúng ta nên tập trung vào để thu hẹp khoảng cách giữa kỳ vọng và đầu ra.


-3

Đơn giản,

Kiểm tra có nghĩa là, tìm đầu vào khiến Phần mềm bị lỗi trong khi gỡ lỗi là quá trình tìm lỗi của một lỗi đã cho.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 10 câu trả lời trước
gnat
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.