Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET 4.0 code contracts - How will they affect unit testing?

For example this article introduces them.

What is the benefit?

Static analysis seems cool but at the same time it would prevent the ability to pass null as a parameter in unit test. (if you followed the example in the article that is)

While on the topic of unit testing - given how things are now surely there is no point for code contracts if you already practice automated testing?

Update

Having played with Code Contracts I'm a little disappointed. For example, based on the code in the accepted answer:

public double CalculateTotal(Order order) {     Contract.Requires(order != null);     Contract.Ensures(Contract.Result<double>() >= 0);     return 2.0; } 

For unit testing, you still have to write tests to ensure that null cannot be passed, and the result is greater than or equal to zero if the contracts are business logic. In other words, if I was to remove the first contract, no tests would break, unless I had specifically had a test for this feature. This is based on not using the static analysis built into the better (ultimate etc...) editions of Visual Studio however.

Essentially they all boil down to an alternate way of writing traditional if statements. My experience actually using TDD, with Code Contracts shows why, and how I went about it.

like image 217
Finglas Avatar asked Sep 05 '09 15:09

Finglas


People also ask

What makes code difficult for unit testing?

Tightly coupled code is extremely hard to unit test (and probably shouldn't be unit tested - it should be re-factored first), because by definition unit tests can only test a specific unit of something. All calls to databases or other components of the system should be avoided from Unit Tests because they violate this.

What can be used for unit testing in .NET solutions?

xUnit. xUnit is a free, open source, community-focused unit testing tool for . NET. Written by the original inventor of NUnit v2, xUnit.net is the latest technology for unit testing .

What does unit testing do for code quality?

Since unit tests act as a safety net, developers become more confident when changing the code. They can refactor the code without fear of breaking things, driving the general quality of the codebase up. Unit tests might contribute to better application architecture.


2 Answers

I don't think unit testing and contracts interfere with each other that much, and if anything contracts should help unit testing since it removes the need to add tedious repetitive tests for invalid arguments. Contracts specify the minimum you can expect from the function, whereas unit tests attempt to validate the actual behaviour for a particular set of inputs. Consider this contrived example:

 public class Order {     public IEnumerable Items { get; } }  public class OrderCalculator {     public double CalculateTotal(Order order)     {         Contract.Requires(order != null);         Contract.Ensures(Contract.Result<double>() >= 0);          return 2.0;     } } 

Clearly the code satisfies the contract, but you'd still need unit testing to validate it actually behaves as you'd expect.

like image 81
Lee Avatar answered Oct 24 '22 13:10

Lee


What is the benefit?

Let's say that you want to make sure that a method never returns null. Now with unit tests, you have to write a bunch of test cases where you call the method with varying inputs and verify that the output is not null. Trouble is, you can't test all possible inputs.

With code contracts, you just declare that the method never returns null. The static analyzer will then complain if it is not possible to prove that. If it doesn't complain, you know that your assertion is correct for all possible inputs.

Less work, perfect correctness guarantees. What's not to like?

like image 32
Wim Coenen Avatar answered Oct 24 '22 12:10

Wim Coenen