2009-06-01 41 views
14

Vì vậy, tôi đã thực hiện thử nghiệm đơn vị một số và có kinh nghiệm viết bài kiểm tra, nhưng tôi chưa hoàn toàn chấp nhận TDD như một công cụ thiết kế.TDD: Nơi bắt đầu thử nghiệm đầu tiên

Dự án hiện tại của tôi là làm lại hệ thống hiện có tạo số sê-ri như là một phần của quy trình lắp ráp công ty. Tôi có hiểu biết về quy trình và quy trình hiện tại do xem xét hệ thống hiện có. Tôi cũng có một danh sách các yêu cầu mới và cách họ sẽ sửa đổi luồng công việc.

Tôi cảm thấy như tôi đã sẵn sàng để bắt đầu viết chương trình và tôi đã quyết định ép bản thân mình để cuối cùng làm TDD từ đầu đến cuối.

Nhưng bây giờ tôi không biết bắt đầu từ đâu. (Tôi cũng tự hỏi nếu tôi lừa dối quá trình TDD bằng cách đã có ý tưởng về luồng chương trình cho người dùng.)

Luồng người dùng thực sự nối tiếp và chỉ là một loạt các bước. Như một ví dụ, bước đầu tiên sẽ là:

  • dùng gửi một số thứ tự sản xuất và nhận được một danh sách các số phần serializable đó hóa đơn đơn đặt hàng vật liệu

Bước tiếp theo là bắt đầu khi người dùng chọn một trong các số phần.

Vì vậy, tôi đã nghĩ rằng tôi có thể sử dụng bước đầu tiên này làm điểm bắt đầu. Tôi biết tôi muốn một đoạn mã có số thứ tự sản xuất và trả về một danh sách các số bộ phận.

// This isn't what I'd want my code to end up looking like 
// but it is the simplest statement of what I want 
IList<string> partNumbers = GetPartNumbersForMfgOrder(string mfgOrder); 

Đọc sách mẫu Kent Becks mà anh ấy nói về chọn các bài kiểm tra nhỏ. Điều này có vẻ như một hộp đen khá lớn. Nó sẽ yêu cầu một kho lưu trữ thứ tự mfg và tôi phải thu thập thông tin một cây cấu trúc sản phẩm để tìm tất cả các số phần có thể áp dụng cho thứ tự mfg này và thậm chí tôi chưa định nghĩa mô hình miền của mình bằng mã.

Vì vậy, một mặt có vẻ như một khởi đầu khốc liệt - một chức năng cấp cao rất chung chung. Mặt khác, tôi cảm thấy như tôi bắt đầu ở cấp độ thấp hơn, tôi thực sự chỉ đoán những gì tôi có thể cần và điều đó có vẻ như chống TDD.


Lưu ý phụ ... đây có phải là cách bạn sử dụng câu chuyện không?

Là một lắp ráp Tôi muốn có được một danh sách các số phần trên một trật tự mfg Vì vậy mà tôi có thể chọn cái nào để serialize

Để được trung thực, một nhà lắp ráp sẽ không bao giờ nói như vậy. Tất cả các nhà lắp ráp muốn là để kết thúc các hoạt động trên nhằm mfg:

Là một lắp ráp tôi muốn đánh dấu các bộ phận với một số serial Vì vậy mà tôi có thể hoàn thành các hoạt động về trình tự mfg

Trả lời

15

Đây là cách tôi sẽ bắt đầu. Giả sử bạn hoàn toàn không có mã cho ứng dụng này.

  1. Xác định câu chuyện của người dùng và giá trị doanh nghiệp mà nó mang lại: "Là người dùng tôi muốn gửi số đơn đặt hàng sản xuất và danh sách số bộ phận của đơn hàng đó để tôi có thể gửi danh sách đến hệ thống kiểm kê "
  2. bắt đầu bằng giao diện người dùng. Tạo một trang rất đơn giản (cho phép ứng dụng web của nó) với ba trường: nhãn, danh sách và nút. Thế là đủ rồi phải không? Người dùng có thể sao chép danh sách và gửi đến hệ thống inv.
  3. Sử dụng mẫu để căn cứ desig của bạn, như MVC.
  4. Xác định thử nghiệm cho phương thức điều khiển của bạn được gọi từ giao diện người dùng. Bạn đang thử nghiệm ở đây rằng bộ điều khiển hoạt động, không phải dữ liệu là chính xác: Assert.AreSame(3, controller.RetrieveParts(mfgOrder).Count)
  5. Viết một thực hiện đơn giản của bộ điều khiển để đảm bảo rằng một cái gì đó được trả về: return new List<MfgOrder>{new MfgOrder(), new MfgOrder(), new MfgOrder()}; Bạn cũng sẽ cần triển khai các lớp cho MfgOrder. .
  6. Giao diện người dùng của bạn đang hoạt động! Làm việc không chính xác, nhưng làm việc. Vì vậy, hãy cho phép bộ điều khiển nhận dữ liệu từ một dịch vụ hoặc DAO. Tạo một đối tượng Mock DAO trong trường hợp thử nghiệm và thêm một kỳ vọng rằng phương thức "partsDao.GetPartsInMfgOrder()" được gọi.
  7. Tạo lớp DAO với phương pháp. Gọi phương thức từ bộ điều khiển. Bộ điều khiển của bạn hiện đã hoàn tất.
  8. Tạo một thử nghiệm riêng để kiểm tra DAO, cuối cùng đảm bảo rằng nó trả về dữ liệu thích hợp từ DB.
  9. Tiếp tục lặp lại cho đến khi bạn hoàn thành công việc. Sau một thời gian ngắn, bạn sẽ quen với nó.

Điểm chính ở đây là tách ứng dụng trong các phần rất nhỏ và thử nghiệm từng phần nhỏ riêng lẻ.

1

Tôi nghĩ rằng bạn có một khởi đầu tốt nhưng không hoàn toàn thấy nó theo cách đó. Bài kiểm tra được cho là để sinh ra nhiều bài kiểm tra hơn có ý nghĩa với tôi như thể bạn nghĩ về nó, bạn có biết số thứ tự sản xuất hay số bộ phận chưa? Bạn phải xây dựng những thứ có thể dẫn đến các bài kiểm tra khác nhưng cuối cùng bạn sẽ nhận được các bài kiểm tra bitty itty tôi tin.

Dưới đây là một câu chuyện mà có thể đòi hỏi một chút phá vỡ:

  • Là một tài khoản Tôi muốn gửi một số thứ tự sản xuất và nhận được một danh sách các số phần serializable đó hóa đơn đơn đặt hàng vật liệu

Tôi nghĩ điều quan trọng là để phá vỡ mọi thứ xuống hơn và hơn nữa thành những mảnh nhỏ mà làm cho nó là để xây dựng toàn bộ điều. Kỹ thuật "Divide and conquer" rất tiện lợi vào những lúc. ;)

+0

Bạn quên phần thứ ba của câu chuyện, lợi ích. Bạn cũng có chi tiết thực hiện trong đó, mà không mang lại bất kỳ lợi ích kinh doanh (serializable). Tôi sẽ nói một câu chuyện hay hơn sẽ giống như "Là người dùng tôi muốn gửi số đơn đặt hàng sản xuất và danh sách số bộ phận của các đơn hàng đó để tôi có thể gửi danh sách tới hệ thống kiểm kê". –

+0

Serializable trong bối cảnh đó không phải là thực hiện, nó là một thuật ngữ tên miền cho biết phần nào có thể mang một số sê-ri, vì vậy điều quan trọng (theo như tôi hiểu các yêu cầu). –

+0

Nếu đó là trường hợp, hơn bạn đúng. Chuyên môn miền là tất cả. –

1

Vâng tốt, bạn đã tung ra bức tường chính xác cùng tôi đã làm khi tôi đã cố gắng TDD cho lần đầu tiên :)

Kể từ đó, tôi đã từ bỏ vào nó, đơn giản chỉ vì nó làm cho refactoring quá đắt - và tôi có xu hướng tái cấu trúc rất nhiều trong giai đoạn phát triển ban đầu.

Với những từ khó hiểu, tôi thấy rằng một trong những khía cạnh quan trọng nhất và quan trọng nhất của TDD là nó buộc bạn định nghĩa giao diện lớp trước khi thực sự triển khai chúng. Đó là một điều rất tốt khi bạn cần phải lắp ráp tất cả các bộ phận của bạn thành một sản phẩm lớn (tốt, thành các sản phẩm phụ;)). Những gì bạn cần làm trước khi viết các bài kiểm tra đầu tiên là có mô hình miền, mô hình triển khai và tốt nhất là một sơ đồ lớp của bạn sẵn sàng trước khi viết mã - đơn giản là vì bạn cần xác định các biến thể, giá trị nhỏ nhất và giá trị tối đa của mình ., trước khi bạn có thể thử nghiệm chúng. Bạn sẽ có thể xác định những điều này ở cấp độ thử nghiệm đơn vị từ thiết kế của bạn.

Soo, trong kinh nghiệm của tôi (không có trong kinh nghiệm của một số tác giả người thích suy lập bản đồ thế giới thực để OO: P), TDD nên đi như thế này:

  1. Tạo sơ đồ triển khai của bạn, từ các đặc tả yêu cầu (OFC, không có gì được đặt trong đá - bao giờ)
  2. Chọn một câu chuyện sử dụng để thực hiện
  3. Tạo hoặc sửa đổi mô hình tên miền để đưa câu chuyện này
  4. Tạo hoặc sửa đổi đẳng cấp sơ đồ của bạn để bao gồm câu chuyện này (bao gồm cả khác nhau lớp thiết kế)
  5. Xác định các vectơ thử nghiệm.
  6. Tạo các thử nghiệm dựa trên giao diện bạn đã thực hiện trong bước 4
  7. Kiểm tra các thử nghiệm (!). Đây là một bước rất quan trọng ..
  8. Thực hiện các lớp
  9. Kiểm tra các lớp
  10. Go có một ly bia với đồng nghiệp của bạn :)
+5

Bạn không làm phát triển thử nghiệm DRIVEN nếu bạn đang làm điều này. Bạn đang viết các bài kiểm tra, nhưng không lấy được thiết kế của bạn từ các trường hợp thử nghiệm. –

+2

Ye, vâng, đó là trong con mắt của kẻ đối xử :) Cách tôi nhìn thấy nó, bạn không thể lấy được 100% thiết kế của bạn từ nguyên nhân thử nghiệm. Ít nhất là không hiệu quả - imho.Các thử nghiệm dành cho các chi tiết thực hiện, không phải cho thiết kế .. Một lần nữa, quan điểm cá nhân của tôi. – cwap

4

này là hoàn toàn okay như một thử nghiệm bắt đầu. Với điều này, bạn xác định hành vi mong đợi - cách hoạt động của nó. Bây giờ nếu bạn cảm thấy bạn đã cắn nhiều hơn bạn đã thích .. bạn có thể tạm thời bỏ qua bài kiểm tra này và viết một bài kiểm tra chi tiết hơn để đưa ra một phần hoặc ít nhất là giữa chừng. Sau đó, các bài kiểm tra khác đưa bạn tới mục tiêu tạo ra bài kiểm tra lớn đầu tiên. Red-Green-Refactor ở mỗi bước.

Kiểm tra nhỏ, tôi nghĩ có nghĩa là bạn không nên thử nghiệm toàn bộ nội dung trong một thử nghiệm. ví dụ. Là các thành phần D.A, B và C trong state1, state2 và state3 sau khi tôi đã gọi là Method1(), Method2() và Method3() với các tham số trên D. Mỗi thử nghiệm nên kiểm tra chỉ một điều. Bạn có thể tìm kiếm SO cho những phẩm chất của các bài kiểm tra tốt.Nhưng tôi muốn xem xét thử nghiệm của bạn trở thành một thử nghiệm nhỏ vì nó là ngắn và tập trung vào một nhiệm vụ - 'Bắt ​​PartNumbers Từ Sản xuất tự'

Cập nhật: Là một To-Hãy thử gợi ý (AFAIR từ cuốn sách của Beck), bạn có thể muốn ngồi xuống và đưa ra một danh sách các bài kiểm tra một dòng cho SUT trên một mảnh giấy. Bây giờ bạn có thể chọn cách dễ nhất (các bài kiểm tra mà bạn tự tin rằng bạn sẽ có thể hoàn thành.) Để xây dựng một số sự tự tin. HOẶC bạn có thể thử một trong những bạn 80% tự tin nhưng có một số khu vực màu xám (sự lựa chọn của tôi quá) bởi vì nó sẽ giúp bạn tìm hiểu một cái gì đó về SUT trên đường đi. Giữ những cái mà bạn không có ý tưởng làm thế nào để tiến hành cho kết thúc ... hy vọng nó sẽ được rõ ràng hơn bởi thời gian những người dễ dàng hơn được thực hiện. Tấn công từng người một và khi họ chuyển sang màu xanh lục.

+0

Vì vậy, điều này làm tôi yên tâm và tôi ngồi xuống để viết bài kiểm tra. Ngay cả suy nghĩ về cách viết nó là một trải nghiệm thiết kế. Tôi không chắc liệu tôi có hài lòng với bài kiểm tra của mình hay không, nhưng đó là điểm khởi đầu và khiến tôi suy nghĩ về một vài điều. – anonymous

+0

Đây chính là đóng góp quan trọng nhất của TDD .. Nó thúc đẩy thiết kế của bạn từ quan điểm của khách hàng - buộc bạn chỉ thêm chức năng cần thiết cho ít nhất một ứng dụng khách. Ban đầu bạn có thể chọn cho các cộng tác viên giả mạo nhưng điều đó vẫn giúp bạn giải quyết được giao diện đơn giản nhất giữa họ - đó là một chiến thắng lớn. Không có yêu cầu hoặc có thể được yêu cầu trong các tính năng trong tương lai; Việc tái cấu trúc liên tục cũng giúp thiết kế của bạn đơn giản, dễ hiểu và do đó có thể duy trì được. – Gishu

+0

Tôi đã quay lại và đọc 40-50 trang đầu tiên của cuốn sách của Beck và một số thứ chìm sâu hơn một chút kể từ lần đọc cuối cùng của tôi (một vài tháng trước). Hai điều đang giúp bạn là a) bạn có thể phạm tội để vượt qua bài kiểm tra và b) bạn lập tức tái cấu trúc một lần màu xanh lá cây. Và có, tập trung và suy nghĩ liên quan đến SUT đang giúp tôi, đặc biệt là suy nghĩ về tất cả các bối cảnh mà SUT có thể tồn tại - nó dẫn đến các thử nghiệm mạnh mẽ hơn, ít giòn hơn. – anonymous

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