Làm thế nào để biết khi nào dừng thử nghiệm?


23

Tôi biết đây là một câu hỏi rất cơ bản. Đối với một số ứng dụng phần mềm, có một số lượng lớn các trường hợp thử nghiệm cho một ứng dụng. Nó không thực tế để kiểm tra tất cả các trường hợp thử nghiệm. Làm thế nào để chúng ta quyết định khi nào ngừng thử nghiệm? (khác với "khi hết tiền").


3
khi nó thất bại ..
Javier

Tôi nghĩ rằng bạn sẽ tìm thấy bài đăng trên blog của Michael Bolton về việc dừng heuristic để kiểm tra hữu ích để đọc: http://www.developsense.com/blog/2009/09/when-do-we-stop-test/ Bạn có thể nhận ra một số các heuristic đã đề nghị trong chủ đề này.
thử nghiệm

Theo kinh nghiệm của tôi, nó đã đủ bằng cách áp dụng nguyên tắc Pareto .
Amir Rezaei

Câu trả lời:


3

Cuốn sách Nghệ thuật kiểm thử phần mềm của Glenford Myers có một quy tắc đơn giản nhưng cũng có nguyên tắc cho việc này: Kiểm tra hoàn tất khi bạn đã ngừng tìm lỗi. Hoặc, thực tế hơn, khi tốc độ bạn tìm thấy các lỗi mới chậm đi rất nhiều.

Lỗi có xu hướng "co cụm" trong một số mô-đun nhất định và một số chức năng nhất định: Thời điểm bạn tìm thấy một lỗi trong một, bạn biết rằng bạn nên tìm hiểu thêm về các lỗi khác. Để tìm lỗi, bạn có thể sử dụng các kỹ thuật kiểm tra hộp đen, kiểm tra whitebox và kiểm tra đột biến. Miễn là bạn đang tìm thấy lỗi, bạn biết rằng quá trình thử nghiệm của bạn đang hoạt động!

Để hình dung tiến trình của bạn, hãy lập biểu đồ số lỗi mà nhóm của bạn đã tìm thấy mỗi ngày. Nếu biểu đồ dốc xuống, thì bạn sẽ biết các kỹ thuật mà nhóm của bạn đang sử dụng sẽ không tìm thấy chúng. Tất nhiên, nếu bạn tin rằng các kỹ thuật của bạn không ngang tầm, thì vui lòng đọc cuốn sách của Myers để áp dụng các nguyên tắc.

Bây giờ, có khả năng bạn chỉ thiếu một bản vá lỗi mới và tốc độ tìm lỗi sẽ tăng lên rất nhiều nếu bạn tiếp tục thử nghiệm thêm một chút nữa. Tuy nhiên, nếu bạn tin rằng kỹ thuật của bạn là âm thanh, điều này là không thể.


Tỷ lệ tìm ra các lỗi mới phụ thuộc rất nhiều vào các yếu tố bên ngoài, và thật đáng buồn - một số người quản lý dự án sẽ chơi trò này. Cem Kaner trích dẫn các ví dụ về nhóm thử nghiệm được gửi đến các bộ phim để tỷ lệ phát hiện lỗi sẽ giảm và PM có thể xuất xưởng.
thử nghiệm

14

Câu trả lời đơn giản là nó phụ thuộc vào hệ thống. Nếu bạn đang viết phần mềm nhúng cho máy theo dõi tim hoặc các công cụ giám sát an toàn cho lò phản ứng hạt nhân thì tiêu chuẩn sẽ cao hơn nhiều so với việc bạn đang viết một nền tảng viết blog.

Đây thực sự là một câu hỏi cho một người kiểm tra hệ thống tốt (và tôi không phải là một người) nhưng tôi sẽ cho nó một shot.

Biện pháp cơ bản của bạn sẽ là phạm vi kiểm tra: Bao nhiêu ứng dụng đã thực sự được kiểm tra (cả bằng thử nghiệm đơn vị và chức năng).

Bạn cần đánh giá từng trường hợp sử dụng tiềm năng (và các tham số cho trường hợp sử dụng đó) để biết khả năng nó thực sự được sử dụng (vì vậy bạn có thể bỏ các trường hợp cạnh), độ phức tạp (những thứ đơn giản ít có khả năng chứa lỗi hơn hoặc ít có khả năng chứa cứng hơn để tìm lỗi), chi phí để kiểm tra (về thời gian) và tác động tiềm ẩn của khuyết tật nếu được phát hiện ở khu vực đó (đây là nơi mà lò phản ứng hạt nhân so với nền tảng blog xuất hiện).

Dựa trên đánh giá đó, bạn cần tìm ra cái nào sẽ được kiểm tra và chi tiết đến mức nào. Khi bạn có một danh sách như vậy, nhóm (bao gồm người quản lý sản phẩm / người quản lý dự án / đại diện người dùng) có thể đi qua danh sách đó và ưu tiên dựa trên các ràng buộc bạn có.

Một kỹ thuật hữu ích để suy nghĩ là bạn cũng có thể thay đổi các trường hợp sử dụng được thử nghiệm với mỗi bản phát hành. Chẳng hạn, bạn có thể có một danh sách các trường hợp kiểm thử không quan trọng và kiểm tra một nửa trong số chúng với một bản phát hành và một nửa với bản tiếp theo (sau đó thay thế). Bằng cách này, bạn đang tăng tổng phạm vi kiểm tra mà bạn nhận được cho nỗ lực (mặc dù có nguy cơ lỗi hồi quy được đưa ra).

Điều này cũng có thể mở rộng để kiểm tra nền tảng - nếu bạn hỗ trợ hai đầu cuối cơ sở dữ liệu (hoặc nhiều trình duyệt) kiểm tra một nửa ứng dụng trên một, nửa còn lại trên kia và sau đó trao đổi bản phát hành tiếp theo.

(Tôi nghĩ điều này được gọi là thoát y nhưng đừng trích dẫn tôi về điều đó.)

Và sau đó, điều cuối cùng cần suy nghĩ không phải là những gì bạn kiểm tra mà là những gì bạn thực sự khắc phục khi các vấn đề được phát hiện. Người ta thường nói "sửa tất cả các lỗi" nhưng thực tế là có áp lực thời gian và không phải tất cả các lỗi đều như nhau. Một lần nữa, kiểm tra lỗi thường xuyên với tất cả các bên liên quan là cách tốt nhất về phía trước. Điều này đặc biệt có liên quan trong đó một bản sửa lỗi có thể đặc biệt xâm phạm vì công việc bổ sung trong kiểm tra lại và kiểm tra hồi quy mà nó tạo ra có thể lớn hơn lợi ích của việc sửa lỗi.


4

Khi rủi ro liên quan đến việc sử dụng phần mềm đã giảm xuống mức chấp nhận được.


7
Vâng, đó là tuyên bố vấn đề, chỉ cần nhắc lại, phải không?
Martin Wickman

@Martin: hình như không phải. Thay vì bắt đầu với trường hợp thử nghiệm 1 và kết thúc bằng trường hợp thử nghiệm, câu trả lời này sẽ khiến người hỏi bắt đầu với trường hợp thử nghiệm quan trọng nhất và kết thúc khi chúng không còn giá trị.

1
Mặc dù về mặt triết học (và chu đáo), tôi nghĩ rằng OP đang tìm kiếm một cái gì đó thực tế hơn một chút.
Martin Wickman

"chấp nhận được" có thể được xác định trước. Điều đó giúp khá nhiều.

@ Thorbjørn: "Có thể được xác định". Vâng nhưng làm thế nào? Đó là những gì OP đang tìm kiếm.
Martin Wickman

3

"Kiểm tra chương trình có thể được sử dụng để hiển thị sự hiện diện của các lỗi, nhưng không bao giờ cho thấy sự vắng mặt của chúng!" -Edsger Dijkstra

Một cái gì đó tốt để ghi nhớ khi thực hiện bất kỳ thử nghiệm, tự động hoặc cách khác. Bạn chỉ có thể chứng minh rằng bạn đã không tìm thấy thêm bất kỳ lỗi nào, không phải là không còn nữa.

Nhưng bạn càng đặt nhiều mắt vào một phần của mã, bạn càng có thể tự tin hơn về hoạt động đúng đắn của nó. Nó rất giống với trích dẫn của Knuth về tối ưu hóa về vấn đề đó: bạn có thể kiểm tra các nội dung sai rất dễ dàng và bạn có thể kiểm tra sai thời điểm trong quá trình phát triển của mình.

Về cơ bản, bạn muốn được bảo hiểm ở hai nơi lớn:

  1. Phần mềm có vượt qua các bài kiểm tra BDD chứng minh rằng nó đáp ứng các yêu cầu đã chỉ định không. Phần mềm thậm chí không thể được gọi là hoàn thành nếu điều này không đúng.

  2. Các phân đoạn quan trọng nhất, phức tạp và không chắc chắn có kiểm tra đầy đủ để cung cấp sự tự tin không? Nếu đó là một vòng lặp cốt lõi, hoặc một cái gì đó bạn phải tối ưu hóa hoặc hack tại: hãy thử nghiệm nó. Nếu nó phức tạp và có nhiều phân tách logic: hãy đặt nhiều thử nghiệm lên nó. Nếu bạn không thể kiểm tra đơn vị hoặc nó được nhúng quá sâu để thực tế kiểm tra trực tiếp: đảm bảo mã đã được xem xét và mã được kiểm tra gián tiếp bằng tay.


2

Nếu bạn đợi cho đến khi dự án kết thúc, bạn thực sự sẽ có một số lượng lớn các trường hợp thử nghiệm. Nếu bạn phân phối liên tục, tập trung vào việc giao hàng nhỏ, bạn sẽ có ít trường hợp kiểm tra hơn ở mỗi lần lặp và bạn sẽ có thể kiểm tra mọi thứ. Nếu bạn không thể thực hiện việc giao hàng nhỏ, thì hãy ưu tiên và bắt đầu thử nghiệm từ ưu tiên lớn nhất và đi kiểm tra cho đến khi bạn phải dừng lại.


+1 cho việc giao hàng nhỏ liên tục và thử nghiệm sớm. Điều này cũng có tác dụng là các lỗi dễ sửa hơn, vì lập trình viên ban đầu vẫn ở trong bối cảnh và chưa chuyển sang khu vực khác. Bây giờ tôi đang làm việc trong một môi trường nơi chúng tôi làm điều này và thật đáng sợ khi mọi người làm việc hiệu quả hơn nhiều.
thử nghiệm

2

Nếu bạn đang nói về thử nghiệm đơn vị và bạn đang thực hiện TDD (viết thử nghiệm trước) thì đây không phải là vấn đề: bạn chỉ dừng thử nghiệm khi các tính năng được thực hiện.

Trong TDD gia tăng, bạn viết một bài kiểm tra thất bại, sau đó triển khai số lượng mã nhỏ nhất có thể vượt qua, sau đó cấu trúc lại. Tiếp tục thêm các thử nghiệm theo cách này cho đến khi phương thức được hoàn thành.

Đây là một ví dụ tuyệt vời.


2

Các nhà thống kê cũng đã xem xét vấn đề này - thực sự sớm nhất là vào những năm 1970-80. Đưa ra các giả định thích hợp về cách phát hiện lỗi, họ cố gắng ước tính số lượng lỗi từ dữ liệu thử nghiệm. Điều này sau đó được sử dụng để xác định thời điểm dừng dựa trên việc tối ưu hóa chức năng mất. Xem ví dụ https://rpub.com/hoehle/17920 ... để biết cách xử lý ngắn một trong những bài viết về vấn đề này, bao gồm mã R về cách thực hiện điều này trong thực tế.

Tất nhiên một vấn đề sẽ luôn là các giả định về quá trình phát hiện lỗi. Ví dụ, trong điều trị trên, người ta cho rằng các lỗi được phát hiện độc lập với nhau. Trong thực tế, sửa một lỗi lớn có thể, ví dụ, gây ra lỗi mới, v.v. Nhưng nó mang lại sự khởi đầu và bổ sung cho cảm giác ruột.


1

Khi ngày vận chuyển đã đến. Không có kết thúc để thử nghiệm cho một phần mềm. Nhưng sau đó một lần nữa có một cái gì đó gọi là lịch trình. Bạn sẽ phải kiểm tra hầu hết các chức năng của mình trong thời gian đã lên lịch và khắc phục các lỗi mà bạn gặp phải. Không có cách nào bạn có thể đảm bảo rằng phần mềm là hoàn hảo.


3
Vì vậy, ngay cả khi bạn đã không kiểm tra một nửa số đó bạn gửi? Đây là tất cả những gì sai với phát triển phần mềm. Bạn không nên gửi thêm với thử nghiệm không đầy đủ rằng bạn sẽ không mã hóa một nửa số đó.
Jon Hopkins

2
Điều này sẽ chỉ tạo ra một sự cam chịu tâm lý nhất định trong người thử nghiệm. Tôi sẽ nghĩ rằng "dù tôi có làm gì đi nữa, tôi không thể kiểm tra thứ này hoàn toàn vì nó sẽ được phát hành vào ngày 1 tháng 1 vì vậy Ill chỉ cần làm bất cứ điều gì tôi có thể cho đến lúc đó". Không phải cách chúng ta nên xây dựng phần mềm phải không?
rsman

Là người kiểm tra hệ thống, tôi hiếm khi ở vị trí mà ngày phát hành bị trì hoãn để thử nghiệm thêm. Tôi biết tôi sẽ không bao giờ kiểm tra bất cứ điều gì hoàn toàn - những gì tôi cố gắng làm là ưu tiên. Rõ ràng, chất lượng của các cuộc gọi tôi thực hiện về lĩnh vực nào cần kiểm tra trước phụ thuộc vào thông tin tôi nhận được về rủi ro kỹ thuật và tầm quan trọng của doanh nghiệp. Điều quan trọng nhất là LUÔN LUÔN phải là một quyết định kinh doanh và không phải là một quyết định dev / test về mức độ rủi ro mà công ty sẵn sàng chấp nhận. Chúng tôi có thể tư vấn, nhưng đó là việc phải quyết định.
thử nghiệm

Mặc dù tôi hoàn toàn đồng ý: nó không được thực hiện cho đến khi nó được thử nghiệm. (Tôi có xu hướng đồng ý với ý kiến ​​rằng chúng ta nên sử dụng thuật ngữ "giai đoạn sửa lỗi" tốt hơn là giai đoạn thử nghiệm.) "Không còn bài kiểm tra nào chúng tôi có thể làm bây giờ", chỉ "không có thêm bài kiểm tra nào chúng tôi nghĩ rằng nó đáng để làm bây giờ".
thử nghiệm

1

Điều đầu tiên để kiểm tra sẽ là "đường dẫn hạnh phúc", trường hợp cạnh và đầu vào không hợp lệ. Nếu sẽ có nhiều hơn một người dùng đồng thời, bạn sẽ cần kiểm tra các vấn đề tương tranh như khóa và điều kiện cuộc đua. Nếu ứng dụng sử dụng các tài nguyên bên ngoài, bạn sẽ cần kiểm tra cách ứng dụng hoạt động khi các tài nguyên đó không khả dụng. Sau đó, bạn có thể sử dụng mã để tìm kiếm những thứ có thể khiến nó bị hỏng và kiểm tra những thứ đó. Khi tất cả các thử nghiệm đó vượt qua, tỷ lệ chi phí / lợi ích của thử nghiệm tiếp theo bắt đầu tăng lên, vì vậy việc dừng lại ở thời điểm đó là hợp lý.


1

Tất cả sôi sục xuống một vấn đề của sự tự tin. Bạn có cảm thấy tự tin rằng hệ thống đã được kiểm tra đủ chưa?

Rõ ràng, "mức độ tự tin" rất chủ quan vì bạn không bao giờ có thể cảm thấy hoàn toàn chắc chắn, nhưng đủ chắc chắn - và đó là những gì chúng tôi đang tìm kiếm. Vì vậy, bạn cần tạo một danh sách các chỉ số, thường được gọi là định nghĩa hoàn thành và phải là thứ mà cả nhóm của bạn đồng ý.

Dưới đây là một vài thử nghiệm liên quan đến "Chỉ số Xong":

  • Việc xây dựng và cài đặt của bạn hoàn toàn tự động và tất cả các thử nghiệm (đơn vị, gui, tích hợp) được thực hiện tự động?
  • Bạn có viết bài kiểm tra của mình trong khi (hoặc tốt nhất là trước đó) viết mã, thay vì sau đó không?
  • Bạn có cảm thấy đủ an toàn để thực hiện tái cấu trúc mã lớn mà không giới thiệu lỗi không?
  • Là mức độ bao phủ mã của bạn đủ cao?
  • Bạn có một người thử nghiệm chuyên dụng trong nhóm của bạn? Là anh ấy / cô ấy tham gia hàng ngày trong suốt toàn bộ sự phát triển và không chỉ ở cuối?
  • Có phải người thử nghiệm của bạn (thám hiểm) đã cố gắng phá vỡ nó mà không thành công?

Nếu bạn có thể kiểm tra những điểm này, thì có lẽ bạn có thể nói bạn đã kiểm tra đủ.


1

Không bao giờ, tôi nghĩ rằng bạn sẽ không bao giờ hoàn thành thử nghiệm trong một hệ thống .. có rất nhiều biến bạn không thể quản lý.

Nhưng, như chúng ta đã biết, bạn không thể kiểm tra "mãi mãi", vì vậy tôi nghĩ rằng giới hạn cơ bản phụ thuộc vào:

  • Khi rủi ro liên quan đến việc sử dụng phần mềm đã giảm xuống mức chấp nhận được. (như @Graham Lee nói)
  • Người dùng hệ thống là ai? nó có thể là bạn hoặc chủ tịch của các quốc gia thống nhất. Trong trường hợp đầu tiên, bạn không quan tâm nhiều nếu một lỗi xuất hiện do bạn giải quyết nó và nó đã được thực hiện. Trong trường hợp thứ hai, bạn không muốn BẤT K bug lỗi nào xuất hiện.
  • Mối quan hệ của bạn với khách hàng của bạn là gì? Có thể khách hàng là bố của bạn, vì vậy nó không quá khủng khiếp, hoặc có thể đó là một công ty lớn.
  • Làm thế nào nghiêm trọng là cho người dùng hệ thống một lỗi? Nó sẽ gây ra chiến tranh thế giới thứ ba hay chỉ là một thông điệp xấu xí?

0

Khi những người phải đăng xuất khi triển khai đều hài lòng.

hoặc trong một số trường hợp, phần lớn các bên có trách nhiệm hài lòng.

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.