4. What we’re going to see
• What is a unit test
Friday, June 29, 2012
5. What we’re going to see
• What is a unit test
• How to write it
Friday, June 29, 2012
6. What we’re going to see
• What is a unit test
• How to write it
• Integration Test vs Unit Test
Friday, June 29, 2012
7. What we’re going to see
• What is a unit test
• How to write it
• Integration Test vs Unit Test
• Testing tools for WP7
Friday, June 29, 2012
8. What we’re going to see
• What is a unit test
• How to write it
• Integration Test vs Unit Test
• Testing tools for WP7
• The first test
Friday, June 29, 2012
9. What we’re going to see
• What is a unit test
• How to write it
• Integration Test vs Unit Test
• Testing tools for WP7
• The first test
• Maintaining test suite
Friday, June 29, 2012
11. From Wikipedia
• A unit test is a piece of a code (usually
a method) that invokes another piece
of code and checks the correctness of
some assumptions afterward.
• If the assumptions turn out to be
wrong, the unit test has failed.
• A “unit” is a method or function.
Friday, June 29, 2012
12. Good test properties
• It should be automated and repeatable.
• It should be easy to implement.
• Once it’s written, it should remain for
future use.
• Anyone should be able to run it.
• It should run at the push of a button.
• It should run quickly.
Roy Osherove
Friday, June 29, 2012
13. Good test properties
• If your test doesn’t follow at least one
of the previous rules, there’s a high
probability that what you’re
implementing isn’t a unit test.
• You’ve done integration testing.
Friday, June 29, 2012
14. Integration Test
• Integration testing means testing two
or more dependent software modules
as a group.
Friday, June 29, 2012
16. Unit vs Integration Test
• integration test: test many units of
code that work together to evaluate
one or more expected results from the
software.
• unit test: test only a single unit in
isolation.
10
Friday, June 29, 2012
17. Classic wp7 approach
• Code coupled with UI
– Xaml + Code Behind -> one class
public partial class MainView : PhoneApplicationPage
{
public MainView()
{
InitializeComponent();
}
}
11
Friday, June 29, 2012
19. MVVM Approach
•Architectural Pattern
•Derived from Presentation Model
pattern (Fowler)
•Clear separation between UI and Logic
UI ViewModel
Collections, DelegateCommand, Properties
13
Friday, June 29, 2012
20. MVVM Approach
• Code structure:
– ViewModel (c#): Logic
– View (Xaml): Presentation
– No more code behind
• Now the ViewModel (as a plain c# class) IS TESTABLE
14
Friday, June 29, 2012
21. Unit Test framework
• Nunit for Windows Phone 7
• No official mocking framework for
Windows Phone 7, but I found out that
Moq 3.1 for silverlight works!
15
Friday, June 29, 2012
22. Test Runner
• NUnit
• Resharper
• Test Driven.net
16
Friday, June 29, 2012
23. Context
• Application that resize images
• Two boxes for the new size
• Ok button
• Error if the image is not in 4:3
17
Friday, June 29, 2012
24. Solution structure
WP7 App
View
ViewModel
WP7 Class Library
NUnit Library (via NuGet)
TestSuite
18
Friday, June 29, 2012
25. MainViewModel
namespace OrangeCode.Resizer.ViewModel
{
public class MainViewModel
{
public int Height { get; set; }
public int Width { get; set; }
public bool RatioCheck
{
get { return Width*3 == Height*4; }
}
}
}
19
Friday, June 29, 2012
26. First test
namespace OrangeCode.Resizer.Fixture
{
public class MainViewModelFixture
{
[Test]
public void RatioCheck_InvalidSize_ReturnFalse()
{
var viewModel= new MainViewModel();
viewModel.Height = 100;
viewModel.Width = 80;
bool result= viewModel.RatioCheck;
Assert.IsFalse(result);
}
}
}
20
Friday, June 29, 2012
27. First test
[MethodName]_[StateUnderTest]_[ExpectedBehavior]
[Test]
public void RatioCheck_InvalidSize_ReturnFalse()
{
var viewModel= new MainViewModel();
viewModel.Height = 100; Arrange objects.
viewModel.Width = 80;
Act on an objects.
bool result = viewModel.RatioCheck;
Assert something expected.
Assert.IsFalse(result);
}
21
Friday, June 29, 2012
29. Refactor our test
[TestFixture]
public class MainViewModelFixture
{
private MainViewModel viewModel;
[SetUp] executed before every test
public void SetUp()
{
viewModel = new MainViewModel();
}
[Test]
public void RatioCheck_InvalidSize_ReturnFalse()
{
viewModel.Height = 100;
viewModel.Width = 80;
Assert.IsFalse(viewModel.RatioCheck);
}
}
23
Friday, June 29, 2012
30. Refactor our test
[TestFixture]
public class MainViewModelFixture
{
[Test]
public void RatioCheck_InvalidSize_ReturnFalse()
{
viewModel.Height = 100;
viewModel.Width = 80;
Assert.IsFalse(viewModel.RatioCheck);
}
[TearDown]
public void TearDown()
{
viewModel=null; executed after every test
}
}
24
Friday, June 29, 2012
34. From red to green
namespace OrangeCode.Resizer.ViewModel
{
public class MainViewModel
{
public int Height { get; set; }
public int Width { get; set; }
public bool RatioCheck
{
get {
if(Width>0 && Height>0)
return Width*3 == Height*4;
return false;
}
}
}
}
28
Friday, June 29, 2012
36. Test Driven Development
• We just made it!
• Life Cycle:
– Write test (red)
– Write logic to pass the test (green)
– Refactor code (refactor)
– Again..
30
Friday, June 29, 2012
37. Back to the first test
[TestCase(10,10)]
[TestCase(12, 12)]
[TestCase(0, 0)]
public void RatioCheck_InvalidSize_ReturnFalse(int height,int width)
{
viewModel.Height = height;
viewModel.Width = width;
Assert.IsFalse(viewModel.RatioCheck);
}
31
Friday, June 29, 2012
38. Good test properties
• It should be automated and repeatable.
• It should be easy to implement.
• Once it’s written, it should remain for future
use.
• Anyone should be able to run it.
• It should run at the push of a button.
• It should run quickly.
32
Friday, June 29, 2012
39. What to test in WP7
• Properties with logic (not only get/set)
• Command
• Navigation between pages
• Interaction with storage
• Converter
• Event
33
Friday, June 29, 2012
40. Final thoughts
• Use small consistent test
– One test can test only one feature
• If work with legacy code
– create an integration test for every feature
– split a integration test in few unit test
34
Friday, June 29, 2012
41. Recap
• What is a unit test
• How to write it
• Integration Test vs Unit Test
• Testing tools
• The first test
• Maintaining test suite
35
Friday, June 29, 2012
42. Be in contact
Mail: michele@orangecode.it
Twitter: @piccoloaiutante
Web: www.orangecode.it
Blog: www.orangecode.it/blog
GitHub: https://github.com/piccoloaiutante
Community: WEBdeBS
36
Friday, June 29, 2012
43. Grazie a
DotNET Lombardia!
37
Friday, June 29, 2012