Tự động tạo thử nghiệm đơn vị


11

Một số chiến lược có thể được sử dụng để tự động hóa việc tạo ra các trường hợp thử nghiệm đơn vị là gì? Những khía cạnh nào bạn sẽ cần xem xét trong mỗi lớp để có thể tạo ra ít nhất một bộ khung trường hợp thử nghiệm đàng hoàng?

Tôi nhận ra một giải pháp tự động toàn diện không thực tế, nhưng tôi muốn tăng tốc độ tạo thử nghiệm ít nhất bằng cách tạo ra một bộ xương. Tôi không tìm kiếm các ví dụ mã, có lẽ một số gợi ý về nơi bắt đầu hoặc ví dụ về nơi đã thực hiện một cái gì đó như thế này để tôi có thể thấy cách họ tiếp cận nó và những gì có thể.

Tôi đặc biệt quan tâm đến các phương pháp tạo bộ xương thử nghiệm đơn vị trong PHP, không cung cấp tất cả các công cụ mà các ngôn ngữ khác có thể, chẳng hạn như gợi ý kiểu hoàn chỉnh , chẳng hạn.


Visual Studio mới nhất là tất cả những gì bạn cần ...
Công việc

Câu trả lời:


5

Chiến lược và bộ xương của bạn phụ thuộc một cách không quan trọng vào loại thử nghiệm nào bạn muốn tạo, loại bảo hiểm bạn đang tìm kiếm và ngôn ngữ / môi trường bạn đang làm việc.

Thật đơn giản để viết một trình tạo thử nghiệm, đối với các ngôn ngữ như C hoặc Java, đọc chữ ký lớp và tự động tạo các thử nghiệm cho các trường hợp góc tiêu chuẩn (truyền vào 0, 2 giá trị ngẫu nhiên, MAX_INT, MIN_INT, cho một đối số nguyên, null cho null , Vân vân...). Sau đó, bạn có thể chạy các thử nghiệm được tạo, ghi lại kết quả cho từng thử nghiệm và lọc thủ công qua chúng để loại bỏ các thử nghiệm không liên quan, phê duyệt kết quả chấp nhận được đối với các thử nghiệm vượt qua (để chúng có thể tự động vượt qua) và đánh dấu là không hợp lệ. .

Bạn có thể tăng cường điều này bằng cách gắn thẻ / nhận xét / tái cấu trúc các lớp để giúp trình tạo của bạn có thêm gợi ý. Bạn có thể có một thẻ liệt kê tất cả các ngoại lệ có thể xảy ra mà một lệnh gọi phương thức được phép nêu ra hoặc cung cấp một phạm vi số nguyên hợp lệ giảm cho một đối số nguyên. Hãy xem những điều này là ngắn hạn để bạn phải tự viết các bài kiểm tra.

Vì vậy, đây là một số thành phần bạn sẽ muốn xem xét:

  • Một thành phần để tự động phân tích mã nguồn / chữ ký hàm / chú thích thủ công, tạo ra các trường hợp thử nghiệm tiêu chuẩn hoặc phác thảo / chữ ký cho các trường hợp thử nghiệm chờ đầu vào của bạn được hoàn thành.
  • Một ngôn ngữ phát triển / thay đổi liên tục của thẻ / chú thích / nhận xét có thể đi đến bất kỳ mức độ chi tiết nào (phương thức / lớp / chữ ký / vòng lặp / v.v ...) thể hiện gợi ý cho trình xây dựng kiểm tra tự động. Lý tưởng nhất là bạn có thể chơi với ngôn ngữ này mà không cần phải mã hóa lại khung của bạn hoặc bất kỳ khối nào trong đó
  • Người chạy thử tự động, với khả năng xác định các bài kiểm tra mới / cũ và ghi / kiểm tra đối với các câu trả lời "chấp nhận được" cho mỗi bài kiểm tra. Lý tưởng nhất là người chạy này sẽ xây dựng cơ sở dữ liệu về các lần chạy thử, kết quả được chấp nhận / từ chối và kết quả chấp nhận được hiện tại cho mỗi bài kiểm tra.
  • "Kẻ giả mạo đối tượng" tự động, được đặt tên lớp và bản đồ tên-> giá trị, có thể tạo một đối tượng bắt chước lớp, trả về dữ liệu tùy chỉnh cho các lệnh gọi hàm, bộ truy cập, khe dữ liệu công cộng, v.v ...

Có rất nhiều khung kiểm tra ngoài đó đã bao gồm các khối chức năng này cho các ngôn ngữ và nền tảng khác nhau. Mặc dù khá dễ dàng để bắt đầu tự thực hiện công việc này và phát triển loại khung này một cách hữu cơ, nhưng đây cũng là một dự án dài hạn vô tận có thể sẽ nhân đôi công việc hiện có. Tôi khuyên bạn nên dành thời gian đáng kể để xem xét những gì có sẵn trước tiên và sau đó quyết định xem có đáng để dành thời gian để lặn không.


5

Tôi chưa có cơ hội sử dụng nó trên một ứng dụng có kích thước hoặc độ phức tạp có ý nghĩa, nhưng có những công cụ, bao gồm cả CodePro Phân tích của Google , tự động hóa việc tạo các thử nghiệm đơn vị cho các ứng dụng Java . Tôi cũng tìm thấy một sản phẩm thương mại, Thử nghiệm C ++ của Parasoft , dường như cho phép tạo ra các thử nghiệm đơn vị C ++

Các ứng dụng này đã sử dụng phương pháp phỏng đoán để tạo ra các trường hợp thử nghiệm. Tôi không chắc chắn rằng có một khung duy nhất mà bạn có thể sử dụng để tạo bộ xương, nhưng có những cấu trúc mà bạn có thể tìm kiếm. Tôi có xu hướng tập trung vào các vòng lặp, các câu lệnh có điều kiện ( ifcác khối, switch/ các casecâu lệnh) và các trường hợp ngoại lệ và tạo các trường hợp thử nghiệm buộc các đường dẫn thực thi khác nhau được thực hiện.

Tôi sẽ không tập trung vào việc tăng tốc độ viết bài kiểm tra bằng cách cố gắng tạo bộ xương hoặc mẫu, mà bằng cách cải thiện phân tích đặc tả và / hoặc thực hiện và viết bài kiểm tra chất lượng cao. Có thể xác định những thử nghiệm nào sớm nhất có giá trị nhất, viết những thử nghiệm đó và sau đó điền vào các lỗ hổng sau đó sẽ có tác động lớn hơn đến năng suất và chất lượng.


Chỉ để cung cấp thêm một số công khai, Falcon đã thử CodePro trong một dự án và viết một chút vụng về về những trải nghiệm của anh ấy .


Phân tích CodePro của Google nghe có vẻ thú vị. Nhưng "Quis oblodiet ipsos giam giữ?" Ai kiểm tra các bài kiểm tra? Điều này chỉ có thể được sử dụng để sao lưu dự án hiện có bằng các thử nghiệm đơn vị và có thể sẽ không phát hiện ra các lỗi, thay vào đó sẽ cho rằng các lỗi là chính xác.
Falcon

@Falcon Bạn không thể tin tưởng một cách mù quáng vào bất kỳ công cụ nào - làm như vậy sẽ khiến bạn đau đầu hơn. Tôi nghĩ rằng mẹo "quan tâm đến nghề thủ công" của Lập trình viên thực dụng áp dụng ở đây. CodePro có chứa trình soạn thảo kiểm tra để biến nó thành tầm thường để xem giá trị nào được truyền vào và kết quả mong đợi là gì, sau đó thực hiện thay đổi cho nó (và sau đó cập nhật mã kiểm tra được tạo để phản ánh những thay đổi này).
Thomas Owens

Tôi chỉ tự hỏi những gì đáng tin cậy hơn trong trường hợp này, con người hoặc máy móc. Tôi nghĩ rằng những bài kiểm tra được tạo ra sẽ gây ra nhiều đau đầu hơn những bài kiểm tra được viết bằng tay. Tốt nhất là bài kiểm tra nên được viết trước. Nhưng tôi chắc chắn sẽ thử. Tôi rất muốn thấy một công cụ có thể tạo ra các thử nghiệm dựa trên các yêu cầu chính thức và một số keo siêu dữ liệu để giao diện hệ thống một ngày nào đó.
Falcon

@Falcon Vâng, lý tưởng nhất là một số bài kiểm tra nên được viết trước, nhưng cho đến khi bạn thực hiện và có thể thực hiện kiểm tra hộp trắng, bạn không nhất thiết phải xem tất cả các trường hợp cạnh khác nhau mà bạn có thể thấy khi bạn thực hiện. Nếu bạn có cơ hội chơi với các tính năng tạo thử nghiệm của CodePro, bạn có thể đăng suy nghĩ của mình ở đâu đó và bằng cách nào đó giúp tôi liên kết không? Tôi quan tâm để xem nó hoạt động tốt như thế nào và trải nghiệm của người khác với nó.
Thomas Owens

Tôi sẽ thử nghiệm nó vào tuần tới với một ứng dụng J2EE cỡ trung bình (120 klocs) kết hợp một số quy tắc kinh doanh thực sự khó khăn và cho bạn biết về những trải nghiệm của tôi ở đây.
Falcon

1

Tôi đã viết một trình tạo để tăng tốc độ kiểm tra đơn vị cho một dự án .NET vài năm trước. Có một cơ sở mã lớn không có bài kiểm tra đơn vị và nó nhằm mục đích nhanh chóng tăng phạm vi bảo hiểm cơ bản. Dưới đây là một số lưu ý có thể hữu ích:

  • Cơ hội của tôi là khung cốt lõi trên đó dự án được phát triển cung cấp các hoạt động tiêu chuẩn và đặt tên lớp. Nếu bạn đang nghĩ đến việc tự viết, một cấu trúc tiêu chuẩn như thế này sẽ giúp ích rất nhiều.
  • Sử dụng data-driven testingsẽ giúp rất nhiều, nếu codebase của bạn cho phép. Khung kiểm tra đã tạo một bảng cơ sở dữ liệu cho từng thử nghiệm đơn vị để lưu trữ dữ liệu thử nghiệm, sao cho mỗi hàng trong bảng đó là một thử nghiệm riêng biệt và không yêu cầu mã bổ sung ( Quy tắc đại diện ). Từ thời điểm này, các bài kiểm tra thực tế có thể dễ dàng được tạo tự động hoặc nhập thủ công.
  • Các thử nghiệm đơn vị kết quả là đơn giản nhưng smoke testít nhất họ đã phục vụ như s. Đối với các khu vực có rủi ro cao hơn, các bài kiểm tra thủ công bổ sung đã được viết.

Tóm lại, tôi đồng ý rằng một giải pháp chung sẽ không thực tế (nếu có thể). Tôi tin rằng cơ hội sẽ tốt hơn nếu codebase phù hợp để tạo thử nghiệm và khung thử nghiệm có thể tận dụng cấu trúc của nó.

(Như một lưu ý phụ, có Pex , nhưng nó dành cho .NET)

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.