View
1.313
Download
0
Category
Tags:
Preview:
DESCRIPTION
An introduction to unit testing in Windows Phone 7
Citation preview
Getting started with Tests on your WP7 App
Friday, June 29, 2012
Who am I?
• Developer freelance:–C# Asp.net Mvc, Wpf, Wp7–Python Django–Blog: orangecode.it/blog
Friday, June 29, 2012
What we’re going to see
Friday, June 29, 2012
What we’re going to see
•What is a unit test
Friday, June 29, 2012
What we’re going to see
•What is a unit test• How to write it
Friday, June 29, 2012
What we’re going to see
•What is a unit test• How to write it• Integration Test vs Unit Test
Friday, June 29, 2012
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
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
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
Let’s start
Friday, June 29, 2012
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
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
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
Integration Test
• Integration testing means testing two or more dependent software modules as a group.
Friday, June 29, 2012
First Test
9
Friday, June 29, 2012
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
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
Classic wp7 approach
Your code is NOT TESTABLE!
12
Friday, June 29, 2012
•Architectural Pattern•Derived from Presentation Model pattern (Fowler)
•Clear separation between UI and Logic
MVVM Approach
13
UI
Collections, DelegateCommand, Properties
ViewModel
Friday, June 29, 2012
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
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
Test Runner
• NUnit
• Resharper
• Test Driven.net
16
Friday, June 29, 2012
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
Solution structure
18
WP7 App
ViewModel
WP7 Class Library
NUnit Library (via NuGet)
TestSuite
View
Friday, June 29, 2012
MainViewModel
19
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; } } }}
Friday, June 29, 2012
First test
20
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); } }}
Friday, June 29, 2012
First test
21
[Test]public void RatioCheck_InvalidSize_ReturnFalse(){
var viewModel= new MainViewModel();
viewModel.Height = 100;viewModel.Width = 80;
bool result = viewModel.RatioCheck;
Assert.IsFalse(result);}
[MethodName]_[StateUnderTest]_[ExpectedBehavior]
Arrange objects.
Act on an objects.
Assert something expected.
Friday, June 29, 2012
Run test
22
Friday, June 29, 2012
Refactor our test
23
[TestFixture] public class MainViewModelFixture { private MainViewModel viewModel;
[SetUp] public void SetUp() { viewModel = new MainViewModel(); }
[Test] public void RatioCheck_InvalidSize_ReturnFalse() { viewModel.Height = 100; viewModel.Width = 80;
Assert.IsFalse(viewModel.RatioCheck); } }
executed before every test
Friday, June 29, 2012
Refactor our test
24
[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
Friday, June 29, 2012
Run test again
25
Friday, June 29, 2012
Some more cases
26
[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); }
Friday, June 29, 2012
Some more cases
27
Friday, June 29, 2012
From red to green
28
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; }
} }}
Friday, June 29, 2012
Run tests
29
Friday, June 29, 2012
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
Back to the first test
31
[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); }
Friday, June 29, 2012
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
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
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
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
Be in contactMail: michele@orangecode.itTwitter: @piccoloaiutanteWeb: www.orangecode.itBlog: www.orangecode.it/blogGitHub: https://github.com/piccoloaiutante
Community: WEBdeBS
36
Friday, June 29, 2012
Grazie aDotNET Lombardia!
37
Friday, June 29, 2012
Recommended