Đối với những người không chắc chắn ý nghĩa của 'ràng buộc không xác định' tôi khuyên bạn nên đánh dấu post của Mark Seeman.Phát hiện các kiểm tra 'đã chết' và dữ liệu mã cứng so với giới hạn không xác định
Bản chất của ý tưởng là thử nghiệm có giá trị xác định chỉ dành cho dữ liệu ảnh hưởng đến hành vi SUT. Không phải dữ liệu 'có liên quan' có thể ở mức độ nào đó 'ngẫu nhiên'.
Tôi thích phương pháp này. Càng có nhiều dữ liệu thì trừu tượng càng trở nên rõ ràng và mang tính kỳ vọng hơn và thực sự nó trở nên khó khăn hơn để vô tình phù hợp với dữ liệu để thử nghiệm.
Tôi đang cố gắng để 'bán' phương pháp này (cùng với AutoFixture) cho các đồng nghiệp của tôi và ngày hôm qua chúng tôi đã có một cuộc tranh luận dài về nó.
Họ đề xuất đối số thú vị về không ổn định khó khăn để gỡ lỗi kiểm tra do dữ liệu ngẫu nhiên.
Lúc đầu, có vẻ hơi lạ vì tất cả chúng ta đều đồng ý rằng luồng dữ liệu ảnh hưởng không được ngẫu nhiên và hành vi đó là không thể. Tuy nhiên tôi đã nghỉ ngơi để suy nghĩ kỹ về mối quan tâm đó. Và cuối cùng tôi đã đến vấn đề sau:
Nhưng một số các giả định của tôi đầu tiên:
- mã kiểm tra phải được xử lý như mã sản xuất.
- Mã kiểm tra PHẢI thể hiện đúng kỳ vọng và thông số kỹ thuật của hành vi hệ thống.
- Không có gì cảnh báo bạn về những mâu thuẫn tốt hơn so với bản dựng bị hỏng (hoặc không được biên soạn hoặc thử nghiệm không thành công - kiểm tra có cổng).
xem xét hai biến thể này của bài kiểm tra tương tự:
[TestMethod]
public void DoSomethig_RetunrsValueIncreasedByTen()
{
// Arrange
ver input = 1;
ver expectedOutput = input+10;
var sut = new MyClass();
// Act
var actualOuptut = sut.DoeSomething(input);
// Assert
Assert.AreEqual(expectedOutput,actualOutput,"Unexpected return value.");
}
/// Here nothing is changed besides input now is random.
[TestMethod]
public void DoSomethig_RetunrsValueIncreasedByTen()
{
// Arrange
var fixture = new Fixture();
ver input = fixture.Create<int>();
ver expectedOutput = input+10;
var sut = new MyClass();
// Act
var actualOuptut = sut.DoeSomething(input);
// Assert
Assert.AreEqual(expectedOutput,actualOutput,"Unexpected return value.");
}
Cho đến nay rất thần, mọi thứ hoạt động và cuộc sống là đẹp nhưng sau đó yêu cầu thay đổi và DoSomething
thay đổi hành vi của nó: bây giờ nó chỉ làm tăng đầu vào nếu nó 'thấp hơn 10 và nhân với 10 cách khác. Điều gì xảy ra ở đây? Các thử nghiệm với dữ liệu hardcoded đi (thực sự vô tình), trong khi thử nghiệm thứ hai không thành công đôi khi. Và cả hai đều là những thử nghiệm lừa dối sai: họ kiểm tra hành vi không tồn tại.
Có vẻ như không quan trọng dữ liệu được mã hóa cứng hoặc ngẫu nhiên: chỉ là không liên quan. Tuy nhiên, chúng tôi không có cách nào mạnh mẽ để phát hiện các thử nghiệm 'chết' đó.
Vì vậy, câu hỏi là:
Có ai lời khuyên tốt làm thế nào để viết bài kiểm tra theo cách tình huống như vậy không xuất hiện?
+1 (Giả sử mã là RẮN.) –
Đồng ý một phần. Vẫn khó có thể tưởng tượng được có bao nhiêu thành phần (hoặc mức độ thừa kế) sẽ có nếu các yêu cầu tự nhiên không ổn định (ví dụ pháp luật) nhưng không thay đổi triệt để mỗi lần và do đó cho phép tái sử dụng. –
@voroninp Điều về các miền không ổn định vốn có là những miền này đặc biệt là các miền mà OCP có giá trị, bởi vì OCP cho phép bạn giữ nguyên logic cũ tại chỗ. Điều này một lần nữa cho phép bạn tính toán lại những thứ * đã * trong quá khứ. Nó cũng cho phép bạn khôi phục lại một quy tắc cũ, trong trường hợp bất cứ ai thay đổi suy nghĩ của họ. –