2008-11-07 39 views
6

Chúng tôi hiện đang sử dụng các bài kiểm tra đơn vị để kiểm tra dự án của chúng tôi. Chúng tôi có phần lớn các chức năng được bảo hiểm nhưng tôi nghĩ rằng các thử nghiệm của chúng tôi quá giòn.Làm cách nào để tạo các bài kiểm tra đơn vị linh hoạt?

Tôi đã tự hỏi liệu có bất kỳ điều cụ thể nào mà chúng tôi có thể thực hiện để làm cho các bài kiểm tra đơn vị linh hoạt hơn để chúng không phá vỡ vì những lý do sai.

Một vài câu trả lời đã đề cập đến việc cẩn thận chế nhạo quá nhiều ... Vậy lý do chính đáng để chế nhạo là gì? Tôi nghĩ rằng đó có thể là một trong những vấn đề chính của chúng tôi, nhưng khi ứng dụng của bạn chủ yếu là một trang web dựa trên cơ sở dữ liệu động, làm thế nào để bạn thoát khỏi chế nhạo?

Trả lời

17

Đây là một câu trả lời khá đơn giản, nhưng cho thấy những suy nghĩ đúng:

  • Một thử nghiệm nên phá vỡ nếu những thay đổi hành vi trong một cách mà bạn quan tâm.
  • Thử nghiệm sẽ tiếp tục hoạt động nếu hành vi thay đổi theo cách bạn không quan tâm.

Vì vậy, càng xa càng tốt - mà không đi vô cùng ra khỏi con đường của bạn - chắc chắn rằng bạn đang thử nghiệm các "kết quả cuối cùng" của phương pháp này mà không quan tâm làm thế nào nó có ở đó. Một điều cần lưu ý là chế giễu - nó cực kỳ hữu ích, nhưng có thể dễ dàng làm cho các bài kiểm tra của bạn trở nên giòn.

5

+1 cho Jon. Đặt tốt.

Tôi đã tìm thấy rất nhiều giá trị trong việc cấu trúc các thử nghiệm của mình theo kiểu BDD hơn. Đó là ... từ chối tư duy cố định mỗi lớp, thay vào đó hãy đi theo lịch thi đấu cho mỗi bối cảnh.

Tôi cũng nhận thấy cú pháp AAA của RhinoMocks 3.5 đẹp hơn rất nhiều.

Tổ chức bìa và thử nghiệm sạch/có thể đọc được.

Để làm cho các bài kiểm tra của tôi kém giòn hơn, tôi đã bắt đầu kéo trở lại chế nhạo. Mock framework là yếu tố quyết định cho việc phụ thuộc vào các phụ thuộc, nhưng bạn càng thử nghiệm càng nhiều bài kiểm tra biết về việc triển khai. Nếu việc thực hiện thay đổi (nhưng hành vi không) thì các xét nghiệm của bạn sẽ không bị phá vỡ.

3

Cũng +1 cho Jon.

Trong thời trang kỹ thuật điển hình, câu trả lời luôn là "phụ thuộc".

Tôi khuyên bạn nên xem cuốn sách "Mẫu thử nghiệm xUnit: Mã kiểm tra tái cấu trúc". (Trong bối cảnh này, x = {J, N} để trang trải cả thế giới Java và .NET và không có ý định rõ ràng cho khung thực tế mới được gọi là xUnit.)

Giống như các mẫu thiết kế đã xuất hiện trong OO thế giới, do đó, có mô hình nổi lên trong thế giới TDD. Nó đáng xem.

+0

Có một trang web để đi kèm với cuốn sách này tại http://xunitpatterns.com/ –

2

tôi thấy rằng khi thử nghiệm của tôi có các thuộc tính sau họ có xu hướng giòn hơn

1) Complex để thiết lập trạng thái chính xác để kiểm tra logic thực tế. 2) Nhiều kỳ vọng trên mocks. 3) Khả năng đọc kém của mã thử nghiệm. 4) Thiết kế hệ thống chung chung.

Để giải quyết những vấn đề này chúng tôi cố gắng làm như sau

1) Thay đổi thiết kế hệ thống để dễ dàng thiết lập các bài kiểm tra, thường là bằng cách áp dụng SRP và tìm kiếm các lỗ hổng trách nhiệm trong lớp học của chúng tôi.

2) sử dụng mocks mà không có kỳ vọng rõ ràng về số lượng hoặc thứ tự cuộc gọi được thực hiện trên mô hình.

3) Xử lý mã kiểm tra như mã sản xuất, thực hiện mã, đánh giá thiết kế, vv

0

Vì vậy, lý do chính đáng cho mocking là gì? Tôi nghĩ rằng đó có thể là một trong số các vấn đề chính của chúng tôi, nhưng khi ứng dụng của bạn chủ yếu là một trang web theo hướng cơ sở dữ liệu động, , làm thế nào để bạn có được cách xa chế nhạo?

Lý do chế giễu một đối tượng bao gồm

  • đối tượng là hoặc sử dụng một nguồn bên ngoài như cơ sở dữ liệu, mạng, hệ thống tập tin
  • đối tượng là một GUI
  • đối tượng không phải là [nhưng] có sẵn
  • hành vi đối tượng không xác định được đối tượng địa lý
  • đắt tiền để thiết lập
Các vấn đề liên quan