2009-05-09 28 views
41

Tôi thường xuyên gặp sự cố này và tôi không chắc chắn cách vượt qua rào cản này. Tôi thực sự muốn bắt đầu học và áp dụng Test-Driven-Development (hoặc BDD, hoặc bất cứ điều gì) nhưng có vẻ như mọi ứng dụng tôi làm ở nơi tôi muốn áp dụng là nó chỉ có khá nhiều cơ sở dữ liệu chuẩn CRUD, và tôi không chắc để đi về việc áp dụng nó. Các đối tượng khá nhiều không làm bất cứ điều gì ngoài việc được tiếp tục tồn tại trong cơ sở dữ liệu; không có logic phức tạp nào cần được kiểm tra. Có một cổng mà cuối cùng tôi sẽ cần phải thử nghiệm cho một dịch vụ của bên thứ ba, nhưng tôi muốn có được cốt lõi của ứng dụng được thực hiện trước tiên. Bất cứ khi nào tôi cố gắng viết các bài kiểm tra, tôi chỉ kết thúc thử nghiệm những nội dung cơ bản mà tôi có lẽ không nên thử nghiệm ngay từ đầu (ví dụ: getters/setters) nhưng không giống như các đối tượng có bất kỳ thứ gì khác. Tôi đoán tôi có thể kiểm tra sự kiên trì nhưng điều này dường như không đúng với tôi bởi vì bạn không phải thực sự nhấn vào một cơ sở dữ liệu, nhưng nếu bạn giả sử nó thì bạn thực sự không kiểm tra bất cứ điều gì bởi vì bạn kiểm soát dữ liệu đang nhổ; như tôi đã thấy rất nhiều ví dụ trong đó có kho lưu trữ mô phỏng một cơ sở dữ liệu bằng cách lặp và tạo danh sách các giá trị đã biết và kiểm tra xác minh rằng "kho lưu trữ" có thể lấy lại một giá trị nhất định ... không nhìn thấy điểm của một thử nghiệm như thế này bởi vì tất nhiên "kho lưu trữ" sẽ trả lại giá trị đó; nó được mã hóa cứng trong lớp! Vâng, tôi thấy nó từ quan điểm TDD thuần túy (nghĩa là bạn cần phải có một bài kiểm tra nói rằng kho lưu trữ của bạn cần một phương thức GetCustomerByName hoặc bất cứ điều gì trước khi bạn có thể viết chính phương thức đó), nhưng điều đó có vẻ giống như giáo điều sau đây. cách "- thử nghiệm dường như không làm bất cứ điều gì hữu ích ngoài việc biện minh cho một phương pháp.Áp dụng TDD khi ứng dụng là 100% CRUD

Tôi có nghĩ về điều này sai không?

Ví dụ, hãy chạy ứng dụng quản lý liên hệ của nhà máy. Chúng tôi có các liên hệ và giả sử chúng tôi có thể gửi tin nhắn đến các liên hệ. Do đó, chúng tôi có hai thực thể: ContactMessage, mỗi thuộc tính chung (ví dụ: Tên, Họ, Email liên hệ và Chủ đề và Nội dung và Ngày cho thư). Nếu cả hai đối tượng này không có bất kỳ hành vi thực sự nào hoặc cần thực hiện bất kỳ logic nào, thì làm thế nào để bạn áp dụng TDD khi thiết kế một ứng dụng như thế này? Mục đích duy nhất của ứng dụng về cơ bản là kéo danh sách địa chỉ liên hệ và hiển thị chúng trên một trang, hiển thị biểu mẫu để gửi tin nhắn và các nội dung tương tự. Tôi không thấy bất kỳ bài kiểm tra hữu ích nào ở đây - tôi có thể nghĩ về một số bài kiểm tra nhưng họ sẽ kiểm tra khá nhiều vì mục đích nói "Xem, tôi có bài kiểm tra!" thay vì thực sự thử nghiệm một số loại logic (Trong khi Ruby on Rails sử dụng tốt nó, tôi không thực sự xem xét kiểm tra xác nhận là một thử nghiệm "hữu ích" vì nó phải là thứ mà khung công tác chăm sóc cho bạn)

+14

Tôi chỉ cần nói ... I * love * tựa đề này câu hỏi. – Shog9

+1

Đây là một câu hỏi rất hay. Tôi tin rằng hầu hết thời gian khi chúng tôi nghe những lý lẽ về biện minh chi phí của TDD, họ thực sự nói chuyện cụ thể về ứng dụng giống như CRUD. – Sake

+4

Đó là những gì tôi đã nhận thấy là tốt.Tôi muốn * để sử dụng TDD (cũng không nhất thiết phải TDD, nhưng thử nghiệm) nhưng tôi không bao giờ có thể nghĩ về những gì để kiểm tra khi ứng dụng chỉ cần để kéo dữ liệu - Tôi đã nhận được một số trả lời tuyệt vời ở đây, mặc dù. –

Trả lời

14

"Mục đích duy nhất của ứng dụng về cơ bản là kéo danh sách liên hệ"

OK. Kiểm tra điều đó. "Kéo" có nghĩa là gì? Nghe có vẻ như "logic".

"hiển thị chúng trên một trang"

OK. Kiểm tra điều đó. Những cái đúng được hiển thị? Mọi thứ ở đó?

"hiển thị biểu mẫu để gửi thư",

OK. Kiểm tra điều đó. Trường phải không? Xác nhận đầu vào tất cả đều hoạt động?

"và các loại tương tự".

OK. Kiểm tra điều đó. Các truy vấn có hoạt động không? Tìm đúng dữ liệu? Hiển thị đúng dữ liệu? Xác nhận đầu vào? Sản xuất các thông báo lỗi đúng cho các đầu vào không hợp lệ?

+0

@ S.Lott Những gì mô tả của bạn ở đây là kiểm tra loại hành vi nhiều hơn ở cấp độ đơn vị như trái ngược với TDD. Tôi đồng ý rằng mỗi khu vực của bạn đã đề cập là ứng cử viên chính cho các bài kiểm tra đơn vị. –

+0

Nếu họ xác định "kéo" ở dạng có thể kiểm tra, thì các thử nghiệm sẽ dẫn đến thiết kế "kéo". Nếu họ xác định "hiển thị chúng trên một trang" về một số kết quả có thể kiểm tra, thì các thử nghiệm sẽ thúc đẩy thiết kế "hiển thị". Nó cảm thấy như TDD với tôi. –

+0

Tôi đồng ý rằng miễn là các bài kiểm tra lái xe thiết kế và không kiểm tra hành vi. –

1

Tôi thấy những gì bạn đang nói, nhưng cuối cùng mô hình của bạn sẽ trở nên đủ tiên tiến mà họ sẽ yêu cầu (hoặc được tăng cường rất nhiều) thử nghiệm tự động. Nếu không, những gì bạn đang phát triển cơ bản là một bảng tính mà ai đó đã phát triển cho bạn.

Vì bạn đã đề cập đến Rails, tôi sẽ nói thử nghiệm tạo/đọc/cập nhật/xóa chuẩn là một ý tưởng tốt cho mỗi thuộc tính, đặc biệt là vì thử nghiệm của bạn cần lưu ý các quyền (điều này là rất lớn). Điều này cũng đảm bảo rằng việc di chuyển của bạn hoạt động như bạn mong đợi.

+0

Tôi không sử dụng Rails, nhưng tôi đã sử dụng nó như là một ví dụ bởi vì nó đã "nướng trong" thử nghiệm và đó là những gì các hướng dẫn bình thường nói rằng bạn nên kiểm tra. Tôi thấy điểm của bạn. –

5

tôi đang làm việc trên một ứng dụng CRUD tinh khiết ngay bây giờ Nhưng tôi thấy rất nhiều lợi ích của trường hợp thử nghiệm đơn vị (Lưu ý- Tôi không nói TDD)

tôi viết mã đầu tiên và sau đó các trường hợp thử nghiệm - nhưng không bao giờ quá xa nhau - đủ sớm mặc dù

Và tôi cũng thử nghiệm các hoạt động CRUD - cũng tồn tại lâu dài với cơ sở dữ liệu.

Khi tôi làm xong với sự kiên trì - và chuyển sang lớp giao diện người dùng- Tôi sẽ có mức độ tin cậy hợp lý rằng lớp dịch vụ \ persistence của tôi tốt và sau đó tôi có thể tập trung vào giao diện người dùng tại thời điểm đó.

Vì vậy IMHO- luôn luôn có lợi ích của xét nghiệm TDD \ Unit (bất cứ điều gì bạn gọi nó tùy thuộc vào cách rất khó, bạn cảm nhận về nó) - ngay cả đối với ứng dụng CRUD Bạn chỉ cần tìm ra chiến lược đúng đắn cho- ứng dụng của bạn

Chỉ cần sử dụng cảm giác thông thường .... và bạn sẽ ổn thôi.

1

Tôi hiện đang làm việc trên ứng dụng CRUD. Những gì tôi đang làm tại thời điểm này là viết các bài kiểm tra đơn vị trên các đối tượng Repository của tôi và kiểm tra xem các tính năng CRUD có hoạt động đúng như chúng cần hay không. Tôi đã thấy rằng điều này vốn đã đơn vị thử nghiệm mã cơ sở dữ liệu thực tế là tốt. Chúng tôi đã tìm thấy khá một vài lỗi trong mã cơ sở dữ liệu theo cách này. Vì vậy, tôi khuyên bạn nên tiếp tục và tiếp tục với các bài kiểm tra đơn vị. Tôi biết việc áp dụng TDD trên các ứng dụng CRUD không hấp dẫn như những gì bạn có thể đọc trong blog hoặc tạp chí, nhưng nó đang phục vụ mục đích của nó và bạn sẽ tốt hơn khi bạn làm việc trên một ứng dụng phức tạp hơn.

2

Chỉ cần một ý tưởng ...

Hãy yêu cầu đối với CRUD, dụng cụ sử dụng như watij hay watir hoặc AutoIt để tạo ra trường hợp thử nghiệm. Bắt đầu tạo giao diện người dùng để chuyển các trường hợp kiểm tra. Một khi bạn có giao diện người dùng lên và đi qua có thể chỉ là một thử nghiệm, hãy bắt đầu viết lớp logic cho bài kiểm tra đó, và sau đó là lớp db.

Đối với hầu hết người dùng, giao diện người dùng là hệ thống. Hãy nhớ viết các trường hợp kiểm tra cho mỗi lớp mới mà bạn đang xây dựng. Vì vậy, thay vì bắt đầu từ db để ứng dụng để lớp ui, bắt đầu theo hướng ngược lại.

Vào cuối ngày, có thể bạn sẽ tích lũy được một bộ kiểm tra hồi quy mạnh mẽ để mang lại cho bạn sự tự tin khi thực hiện tái cấu trúc an toàn.

đây chỉ là một ý tưởng ...

+0

Thú vị ... Tôi sẽ tra cứu các công cụ này. Cảm ơn bạn. Sự lựa chọn cá nhân của tôi là phát triển ứng dụng từ dưới lên thay thế. Tôi đến từ nền ứng dụng doanh nghiệp - do đó có sự tôn trọng lớn hơn đối với lớp Dịch vụ và mô hình Cơ sở dữ liệu - để giải quyết vấn đề đó trước tiên. Nhưng những gì bạn nói- có ý nghĩa cũng như –

+0

điều này có thể bạn quan tâm ... http://fitnesse.org/ FitNesse cho phép khách hàng, người thử nghiệm và lập trình viên biết phần mềm của họ nên làm gì và tự động so sánh với những gì nó thực sự làm. Nó so sánh mong đợi của khách hàng với kết quả thực tế. – zeroin23

+0

Đó thường là cách BDD được thực hiện, bạn có thể nghĩ nó là hai vòng tròn đồng tâm, bên ngoài là tính năng mức cao, bên trong là mức thực hiện thấp hơn mà mức cao phụ thuộc vào. Bạn bắt đầu với mức cao bằng cách sử dụng các công cụ như fitnesse hoặc dưa chuột, sau đó bạn xác định từng bước như một bài kiểm tra thực thi mức cao bằng cách sử dụng capybara hoặc selenium, từ đó bạn làm việc ra lớp giữa và cuối cùng là lớp dữ liệu. Cách tiếp cận này cung cấp cho bạn các chức năng đầy đủ các lát dọc tại một thời điểm. –

3

Bỏ qua. Tất cả sẽ ổn thôi. Tôi chắc rằng bạn có thời hạn để gặp. (/ sarcasm)

Tháng tiếp theo, chúng tôi có thể quay lại và tối ưu hóa các truy vấn dựa trên phản hồi của người dùng. Và phá vỡ những thứ mà chúng tôi không biết chúng tôi không được phép phá vỡ.

Nếu bạn nghĩ rằng dự án sẽ kéo dài 2 tuần và sau đó không bao giờ được mở lại, kiểm tra tự động có thể là một sự lãng phí thời gian. Nếu không, nếu bạn có quyền lợi trong việc "sở hữu" mã này trong một vài tháng, và hoạt động của nó, hãy xây dựng một số thử nghiệm. Sử dụng bản án của bạn như là nơi nguy cơ nhất là. Tệ hơn nữa, nếu bạn có kế hoạch làm việc với công ty trong vài năm, và có những đồng đội khác thay phiên nhau đánh cắp các phần khác nhau của hệ thống, và có thể đến lượt bạn một năm nữa, hãy xây dựng một số thử nghiệm.

Đừng làm điều đó, nhưng hãy "gắn một vài ghim vào nó", để nếu mọi thứ bắt đầu "di chuyển xung quanh", bạn có một số báo thức để gọi sự chú ý đến mọi thứ.

Hầu hết các thử nghiệm của tôi là JUnit hoặc kiểm tra loại "diff", và một công cụ loại scraper màn hình thô sơ tôi đã viết một vài năm trước (kịch bản một số công cụ regex + wget/curl). Tôi nghe thấy Selenium được cho là một công cụ tốt để thử nghiệm giao diện người dùng ứng dụng web, nhưng chưa thử nó. Có ai có sẵn các công cụ cho các ứng dụng GUI cục bộ không ???

5

Tôi cảm thấy như chúng tôi đang nhầm lẫn TDD với Kiểm tra đơn vị.

Kiểm tra đơn vị là các thử nghiệm cụ thể kiểm tra đơn vị hành vi. Các thử nghiệm này thường được bao gồm trong bản dựng tích hợp. S.Lott đã mô tả một số ứng cử viên xuất sắc chỉ cho những loại bài kiểm tra đó.

TDD dành cho thiết kế. Tôi tìm thấy thường xuyên hơn sau đó không phải là các bài kiểm tra của tôi tôi viết khi sử dụng TDD sẽ bị loại bỏ hoặc phát triển thành một bài kiểm tra đơn vị. Lý do đằng sau điều này là khi tôi đang thực hiện TDD Tôi đang thử nghiệm thiết kế của mình trong khi tôi đang thiết kế ứng dụng, lớp học, phương pháp, tên miền, v.v ...

Để phản hồi kịch bản của bạn, tôi đồng ý với những gì S.Lott ngụ ý là những gì bạn cần là một bộ kiểm thử đơn vị để kiểm tra các hành vi cụ thể trong ứng dụng của bạn.

1

Những ngày này bạn không cần nhiều mã viết tay cho ứng dụng CRUD ngoài giao diện người dùng, vì có 101 khung công tác sẽ tạo cơ sở dữ liệu và mã truy cập dữ liệu.

Vì vậy, tôi sẽ xem xét giảm số lượng mã viết tay và tự động kiểm tra giao diện người dùng. Sau đó, tôi sẽ sử dụng TDD của các bit lẻ của logic cần phải được viết bằng tay.

3

TDDing một ứng dụng CRUD đơn giản là theo ý kiến ​​của tôi giống như thực hành quy mô trên cây đàn guitar, bạn có thể nghĩ rằng đó là nhàm chán và tẻ nhạt chỉ để khám phá bao nhiêu chơi của bạn cải thiện. Trong điều kiện phát triển - bạn sẽ có khả năng viết mã ít bị ghép đôi - dễ kiểm tra hơn. Ngoài ra, bạn có nhiều khả năng nhìn thấy mọi thứ từ góc nhìn của người tiêu dùng mã - bạn sẽ thực sự sử dụng nó. Điều này có thể có rất nhiều tác dụng phụ thú vị như API trực quan hơn, phân biệt tốt hơn các mối quan tâm, vv. Cấp có máy phát điện giàn giáo có thể làm CRUD cơ bản cho bạn và họ có một vị trí đặc biệt để tạo mẫu, tuy nhiên chúng thường gắn liền với một khuôn khổ của các loại. Tại sao không tập trung vào miền lõi trước, trì hoãn các quyết định Khung/Giao diện người dùng/Cơ sở dữ liệu cho đến khi bạn có ý tưởng tốt hơn về chức năng cốt lõi cần thiết - TDD cũng có thể giúp bạn thực hiện điều đó. Trong ví dụ của bạn: Bạn có muốn thư là hàng đợi hoặc cây phân cấp, v.v ... không? Bạn có muốn chúng được tải trong thời gian thực không? Điều gì về phân loại/tìm kiếm? bạn cần hỗ trợ JSON hay chỉ là html? dễ dàng hơn để xem các loại câu hỏi này với BDD/TDD. Nếu bạn đang làm TDD, bạn có thể kiểm tra logic cốt lõi của mình mà không cần sử dụng khung công tác (và đợi một phút để tải/chạy)

Các vấn đề liên quan