2010-07-15 13 views
5

Tôi vừa mới xem qua BBD và specflow và nó trông rất thú vị. Khi viết các câu chuyện của người dùng, chúng thường ở mức cao và diễn viên sử dụng GUI. Vì vậy, khi viết kịch bản, họ thường sẽ là thử nghiệm GUI hoặc kiểm tra tích hợp từ mức cao của hệ thống. Nhưng những gì về kiểm tra đơn vị tiếp tục xuống trong giải pháp? Ví dụ. các điểm cuối dịch vụ, đối tượng kinh doanh, v.v. Tôi có nên viết kịch bản mới cho chúng hoặc có cách nào để sử dụng lại các kịch bản tương tự cho thử nghiệm ở mức độ thấp (đơn vị kiểm tra) hay tôi nên sao chép và qua các kịch bản?Sử dụng các kịch bản Luồng cho cả các bài kiểm tra tích hợp và các bài kiểm tra đơn vị

Vui lòng cho tôi biết nếu tôi đã hiểu sai.

Trả lời

9

Các khuôn khổ BDD như SpecFlow được thiết kế để giúp các thành viên nhóm kỹ thuật giao tiếp dễ dàng hơn với các bên liên quan phi kỹ thuật của dự án.

Thông số kỹ thuật tiếng Anh không dễ bảo trì hoặc tái cấu trúc. Vì những người chỉ đọc các bài kiểm tra đơn vị cấp hoặc các ví dụ là kỹ thuật và có khả năng đọc mã, tôi thích sử dụng các khuôn khổ kiểm tra đơn vị như NUnit ở cấp đó.

Các trường hợp thường có độ phức tạp hơn nhiều so với các bài kiểm tra đơn vị. Thông thường tôi thấy rằng chúng bao gồm một số kết hợp của logic nghiệp vụ nội bộ, và mỗi khía cạnh tạo thành một sự kết hợp sẽ là trách nhiệm của một đơn vị mã khác. Do đó, logic trong các kịch bản sẽ được phân chia giữa một số bài kiểm tra đơn vị khác nhau và bạn sẽ không thể sao chép chúng.

Thỉnh thoảng tôi sử dụng các tình huống để hướng dẫn các bài kiểm tra đơn vị của mình. Tôi có thể thấy rằng một chút logic kết thúc là trách nhiệm của một đơn vị mã cụ thể, và sau đó tôi có thể sao chép chỉ các bước có liên quan từ kịch bản vào các kiểm tra đơn vị dưới dạng nhận xét.

// Given I have $100 in my account 
var account = new Mock<Account>(); 
account.SetupGet(a => a.Balance).Returns(100); 

var accountProvider = new Mock<AccountProvider>(); 
accountProvider.Setup(ap => ap.AccountFor("lunivore")).Returns(account); 

// When I ask for $20 
var atm = new ATM(accountProvider); 
atm.PutInCardFor("lunivore"); 
int money = atm.RequestMoney(20); 

// Then I should get $20 
Assert.AreEqual(20, money); 

// And my account should have paid out $20 
account.verify(a => a.PayOut(20)); 

Tôi khuyến khích bạn sao chép ngôn ngữ mà kịch bản được viết (ví dụ: PayOut). Điều này phù hợp với "ngôn ngữ phổ biến" của Domain Driven Design. Việc mang ngôn ngữ đó vào cả hai bài kiểm tra và mã số đơn vị cũng giúp một nhóm trò chuyện với các bên liên quan, bởi vì bạn sẽ không phải thực hiện việc dịch đi lặp lại.

Đưa ra/Khi/Sau đó vào nhận xét cũng thực sự giúp tôi tập trung vào việc phân phối mã thực sự sẽ được sử dụng, thay vì cố đoán ở tất cả các trường hợp cạnh. Mã chất lượng tốt nhất là công cụ bạn không ghi.

Chúc may mắn!