SlideShare a Scribd company logo
1 of 23
TestApi A library of testing types,  data-structures and algorithms Ivo Manolov, Microsoft
Sharing of {Test} Code is GOOD Reduced duplication of effort Higher code quality - through evolution Lower maintenance costs Deeper, more mature coverage Etc, etc, etc(see your favorite book on code reuse) 2
Sharing of Tests is TRICKY Need to “adapt” tests to environment Test environment dictates policy… Discovery Deployment / Distribution Execution Logging Reporting Result aggregation and reporting 3
Sharing of Tools is TRICKY Big tools / infrastructure High adoption cost “Proprietary” stack – extension may be tricky “Hosting” costs Deployment on dev machines is frowned upon Combining tool parts may not be supported Small tools (e.g. PICT.EXE, RADAR): Deployment Cleanup Adaptation (of input / output) Upgrades SLAs 4
Well, what CAN we share? Automated tests ARE programs A Program =  		reusable blocks+  		domain-specific logic + config We can share the blocks! 5
Enter TestApi… 6
TestApi is… An API library Provides data-structures and algorithms common to testing Documented Layered Easy to deploy (xcopy) Policy-free It’s just a set of DLLs you link to We have xUnit, NUnit, MSTEST samples Licensed under Ms-PL (shared source) 7
TestApi is notgoing to… tell you what a test is tell you how to test make a test pass/fail decision for you tell you how to log make implicit assumptions integrate with your tools (VS, Eclipse, etc.) retain execution state 8
A Lap Around TestApi 9
Package http://codeplex.com/testapi The ZIP contains… Binaries Sources Documentation Samples 10
Input Simulation API Mouse.MoveTo(new Point(10, 10)); Mouse.Click(MouseButton.Left); Keyboard.Type("Hello world!"); Keyboard.Press(Key.LeftShift); Keyboard.Type("hello, capitalized world!"); Keyboard.Release(Key.LeftShift); 11 Mouse and Keyboard are wrappers of the SendInput Win32 API.  They are GUI-toolkit-agnostic (Mouse works in screen coordinates, etc.)
Visual Verification API // Take a snapshot of a window. Load a snapshot from disk. Compare. Snapshot actual = Snapshot.FromWindow(hwnd, WindowSnapshotMode.ExcludeWindowBorder); Snapshot expected = Snapshot.FromFile("Expected.png"); Snapshot difference = actual.CompareTo(expected); // Initialize a SnapshotVerifier and use it to verify the difference image Snapshot toleranceMap = Snapshot.FromFile("ExpectedImageToleranceMap.png"); SnapshotVerifier verifier = new SnapshotToleranceMapVerifier(toleranceMap); if (verifier.Verify(difference) == VerificationResult.Fail) { actual.ToFile("Actual.png", ImageFormat.Png); difference.ToFile("Difference.png", ImageFormat.Png); Console.WriteLine("Image mismatch!"); } 12 The API provides different visual verification strategies via different SnapshotVerifiers
Variation Generation API Define a set of named parameters and constraints. var destination = new Parameter<string>("Destination") { "Whistler", "Las Vegas" }; varhotelQuality = new Parameter<int>("Hotel Quality") { 5, 4, 3, 2, 1 };  var activity = new Parameter<string>("Activity") { "gambling", "swimming", "skiing" }; var parameters = new List<ParameterBase> { destination, hotelQuality, activity}; var constraints = new List<Constraint<Variation>> { Constraint<Variation>        .If(v => destination.GetValue(v) == "Las Vegas")        .Then(v => activity.GetValue(v) != "skiing"),     ... }; Modelmodel = new Model(parameters, constraints); foreach(varv in model.GenerateVariations(2, 1234)) { Console.WriteLine("{0} {1} {2}",          v["Destination"], v["Hotel Quality"], v["Activity"]); } Create a model from them. Then query the model for variations. 13
Variation Generation API - 2 14 // Need to go to Cleveland more often... object tag = (object)-1; double weight = 5.0; var destination =      new Parameter<string>("Destination")      {          "Whistler",          "Hawaii",          "Las Vegas",         new ParameterValue<string>("Cleveland", tag, weight)     }; ... foreach(var v in model.GenerateVariations(2, 1234)) {     switch (v.Tag as int) {...} } Parameter value weights are also supported. Parameter value tags provide a generic support for “negative” variations, etc.
Variation Generation API - 3 class OsConfiguration { [Parameter(512, 1024, 2048)]   public int Memory { get; set; } [Parameter("WinXP")]   [Parameter("Vista", "Win7", Weight = 3.0F)]    public string OS { get; set; } } static void CreateModel() { var model = new Model<OsConfiguration>(); foreach(OsConfigurationc in model.GenerateVariations(2))    { Console.WriteLine(         "{0} {1}",  c.Memory,  c.OS); } 15 Models can also be constructed declaratively.  The declarative syntax supports equivalence classes and weights too.
Fault Injection API string caller = "MyApp.Main(string[])" string method = "MyApp.PrintToConsole(string)"; Exception exception = new ApplicationException("Injected!")); // Create a set of fault rules ICondition condition = BuiltInConditions.TriggerIfCalledBy(caller); IFault fault = BuiltInFaults.ThrowExceptionFault(exception); FaultRule rule = new FaultRule(method, condition, fault); // Establish a session, injecting faults defined by the rules FaultSession session = new FaultSession(rule); // Launch the target process. Observe faults. ProcessStartInfo psi = session.GetProcessStartInfo(@"yApp.exe"); Process p = Process.Start(psi); ... Under the cover, TestApi uses the CLR profiling API to modify the prologue of the intercepted method at runtime… 16
Memory Leak Detection API // Start your process... // Perform various operations. Take memory snapshots MemorySnapshot s1 = MemorySnapshot.FromProcess(pid); ... MemorySnapshot s2 = MemorySnapshot.FromProcess(pid); // Compare snapshots. Identify possible leaks. MemorySnapshot diff = s2.CompareTo(s1); if (diff.GdiObjectCount != 0) {     s1.ToFile(@"1.xml");     s2.ToFile(@"2.xml"); Console.WriteLine("Possible GDI handle leak."); } 17
Text Generation API StringProperties sp = new StringProperties(); sp.UnicodeRanges.Add(new UnicodeRange(0x0400, 0x04FF)); sp.MinNumberOfCodePoints = sp.MaxNumberOfCodePoints = 10; string s = StringFactory.GenerateRandomString(sp, 1234); The result would be a string of 10 characters in the Cyrillic Unicode character code range, e.g. … “хѝЗКтТшщчЯ” 18
Object Comparison API // o1 and o2 are arbitrarily complex objects... ObjectGraphFactory f = new PublicPropertyObjectGraphFactory(); ObjectComparer c = new ObjectComparer(f);   bool match = c.Compare(o1, o2); if (!match) { Console.WriteLine("The two objects do not match."); }   // you can also get a collection of mismatches... bool match = c.Compare(o1, o2, out mismatches); ... For custom comparison  strategies, create your own ObjectGraphFactory. ObjectComparisonMismatch instances. 19
Application Control API var a = new OutOfProcessApplication(     new OutOfProcessApplicationSettings     {  ProcessStartInfo = new ProcessStartInfo(path),  ApplicationImplementationFactory =              new UIAutomationOutOfProcessApplicationFactory()      });  a.Start();  a.WaitForMainWindow(TimeSpan.FromMilliseconds(5000));  // Perform various tests...  a.Close(); The API provides both in-proc and out-of-proc application control capabilities for arbitrary applications (you may need to write your own factories) 20
Command-Line Parsing API // Example 1:  // Parse "test.exe /verbose /runId=10"  CommandLineDictionary d =  CommandLineDictionary.FromArguments(args) bool verbose = d.ContainsKey("verbose"); inttestId = Int32.Parse(d["testId"]); // Example 2: // Parse the same into a structure public class MyArguments { public bool? Verbose { get; set; } public int? RunId { get; set; } } MyArguments a = new MyArguments(); CommandLineParser.ParseArguments(a, args); There is also a 3rd layer, which provides capability to parse into type-safe commands to support usages such as  “Test.exe run /runId=10 /verbose” 21
In Closing… TestApi enables code reuse at the building block level. Think of it as a testing BCL. Democratic use of facilities – no strings attached Layered, decoupled Public Get Engaged! http://codeplex.com/testapi testapi@microsoft.com 22
Q & A ? 23

More Related Content

What's hot

What's hot (20)

Belajar Postman test runner
Belajar Postman test runnerBelajar Postman test runner
Belajar Postman test runner
 
Api testing
Api testingApi testing
Api testing
 
Api testing
Api testingApi testing
Api testing
 
RESTful API Testing using Postman, Newman, and Jenkins
RESTful API Testing using Postman, Newman, and JenkinsRESTful API Testing using Postman, Newman, and Jenkins
RESTful API Testing using Postman, Newman, and Jenkins
 
Postman. From simple API test to end to end scenario
Postman. From simple API test to end to end scenarioPostman. From simple API test to end to end scenario
Postman. From simple API test to end to end scenario
 
Test Design and Automation for REST API
Test Design and Automation for REST APITest Design and Automation for REST API
Test Design and Automation for REST API
 
[Kong summit 2019] Egress Gateway Pattern - Zhuojie Zhou
[Kong summit 2019] Egress Gateway Pattern - Zhuojie Zhou[Kong summit 2019] Egress Gateway Pattern - Zhuojie Zhou
[Kong summit 2019] Egress Gateway Pattern - Zhuojie Zhou
 
API Test Automation
API Test Automation API Test Automation
API Test Automation
 
API TESTING
API TESTINGAPI TESTING
API TESTING
 
4 Major Advantages of API Testing
4 Major Advantages of API Testing4 Major Advantages of API Testing
4 Major Advantages of API Testing
 
Api Testing
Api TestingApi Testing
Api Testing
 
API Testing. Streamline your testing process.
API Testing. Streamline your testing process.API Testing. Streamline your testing process.
API Testing. Streamline your testing process.
 
Accelerate Quality with Postman - Basics
Accelerate Quality with Postman - BasicsAccelerate Quality with Postman - Basics
Accelerate Quality with Postman - Basics
 
API Test Automation Tips and Tricks
API Test Automation Tips and TricksAPI Test Automation Tips and Tricks
API Test Automation Tips and Tricks
 
Space Camp June 2022 - API First.pdf
Space Camp June 2022 - API First.pdfSpace Camp June 2022 - API First.pdf
Space Camp June 2022 - API First.pdf
 
Designing APIs with OpenAPI Spec
Designing APIs with OpenAPI SpecDesigning APIs with OpenAPI Spec
Designing APIs with OpenAPI Spec
 
[GDSC-ADYPU] APIs 101 with Postman
[GDSC-ADYPU] APIs 101 with Postman[GDSC-ADYPU] APIs 101 with Postman
[GDSC-ADYPU] APIs 101 with Postman
 
Reasons To Automate API Testing Process
Reasons To Automate API Testing ProcessReasons To Automate API Testing Process
Reasons To Automate API Testing Process
 
API_Testing_with_Postman
API_Testing_with_PostmanAPI_Testing_with_Postman
API_Testing_with_Postman
 
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
 

Viewers also liked

Evaluating and Testing Web APIs
Evaluating and Testing Web APIsEvaluating and Testing Web APIs
Evaluating and Testing Web APIs
SmartBear
 

Viewers also liked (15)

REST API testing with SpecFlow
REST API testing with SpecFlowREST API testing with SpecFlow
REST API testing with SpecFlow
 
Data Driven API Testing: Best Practices for Real-World Testing Scenarios
Data Driven API Testing: Best Practices for Real-World Testing ScenariosData Driven API Testing: Best Practices for Real-World Testing Scenarios
Data Driven API Testing: Best Practices for Real-World Testing Scenarios
 
Api testing
Api testingApi testing
Api testing
 
Evaluating and Testing Web APIs
Evaluating and Testing Web APIsEvaluating and Testing Web APIs
Evaluating and Testing Web APIs
 
Testing APIs in the Cloud
Testing APIs in the CloudTesting APIs in the Cloud
Testing APIs in the Cloud
 
Android Test Automation Workshop
Android Test Automation WorkshopAndroid Test Automation Workshop
Android Test Automation Workshop
 
Do You Enjoy Espresso in Android App Testing?
Do You Enjoy Espresso in Android App Testing?Do You Enjoy Espresso in Android App Testing?
Do You Enjoy Espresso in Android App Testing?
 
Bohomolets Microbiology Lecture #18
Bohomolets Microbiology Lecture #18Bohomolets Microbiology Lecture #18
Bohomolets Microbiology Lecture #18
 
BDD for APIs
BDD for APIsBDD for APIs
BDD for APIs
 
Different Android Test Automation Frameworks - What Works You the Best?
Different Android Test Automation Frameworks - What Works You the Best?Different Android Test Automation Frameworks - What Works You the Best?
Different Android Test Automation Frameworks - What Works You the Best?
 
Frisby: Rest API Automation Framework
Frisby: Rest API Automation FrameworkFrisby: Rest API Automation Framework
Frisby: Rest API Automation Framework
 
Web API Test Automation using Frisby & Node.js
Web API Test Automation using Frisby  & Node.jsWeb API Test Automation using Frisby  & Node.js
Web API Test Automation using Frisby & Node.js
 
The Progression of APIs and Microservices - Photon Infotech
The Progression of APIs and Microservices - Photon InfotechThe Progression of APIs and Microservices - Photon Infotech
The Progression of APIs and Microservices - Photon Infotech
 
Salmonella
SalmonellaSalmonella
Salmonella
 
Testing web services
Testing web servicesTesting web services
Testing web services
 

Similar to Test api

Compatibility Detector Tool of Chrome extensions
Compatibility Detector Tool of Chrome extensionsCompatibility Detector Tool of Chrome extensions
Compatibility Detector Tool of Chrome extensions
Kai Cui
 
Use Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDEUse Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDE
Benjamin Cabé
 
.NET Portfolio
.NET Portfolio.NET Portfolio
.NET Portfolio
mwillmer
 
Test strategy for web development
Test strategy for web developmentTest strategy for web development
Test strategy for web development
alice yang
 
QTP Interview Questions and answers
QTP Interview Questions and answersQTP Interview Questions and answers
QTP Interview Questions and answers
Rita Singh
 
Qtp Training Deepti 3 Of 44256
Qtp Training Deepti 3 Of 44256Qtp Training Deepti 3 Of 44256
Qtp Training Deepti 3 Of 44256
Azhar Satti
 
E catt tutorial
E catt tutorialE catt tutorial
E catt tutorial
Naveen Raj
 

Similar to Test api (20)

Mastering Mock Objects - Advanced Unit Testing for Java
Mastering Mock Objects - Advanced Unit Testing for JavaMastering Mock Objects - Advanced Unit Testing for Java
Mastering Mock Objects - Advanced Unit Testing for Java
 
Oleksandr Valetskyy - DI vs. IoC
Oleksandr Valetskyy - DI vs. IoCOleksandr Valetskyy - DI vs. IoC
Oleksandr Valetskyy - DI vs. IoC
 
JMockit Framework Overview
JMockit Framework OverviewJMockit Framework Overview
JMockit Framework Overview
 
Compatibility Detector Tool of Chrome extensions
Compatibility Detector Tool of Chrome extensionsCompatibility Detector Tool of Chrome extensions
Compatibility Detector Tool of Chrome extensions
 
Use Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDEUse Eclipse technologies to build a modern embedded IDE
Use Eclipse technologies to build a modern embedded IDE
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
.NET Portfolio
.NET Portfolio.NET Portfolio
.NET Portfolio
 
Tdd,Ioc
Tdd,IocTdd,Ioc
Tdd,Ioc
 
Performance and Scalability Testing with Python and Multi-Mechanize
Performance and Scalability Testing with Python and Multi-MechanizePerformance and Scalability Testing with Python and Multi-Mechanize
Performance and Scalability Testing with Python and Multi-Mechanize
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
 
Analysis of Microsoft Code Contracts
Analysis of Microsoft Code ContractsAnalysis of Microsoft Code Contracts
Analysis of Microsoft Code Contracts
 
Test strategy for web development
Test strategy for web developmentTest strategy for web development
Test strategy for web development
 
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft EdgeChakraCore: analysis of JavaScript-engine for Microsoft Edge
ChakraCore: analysis of JavaScript-engine for Microsoft Edge
 
QTP Interview Questions and answers
QTP Interview Questions and answersQTP Interview Questions and answers
QTP Interview Questions and answers
 
Checking Clang 11 with PVS-Studio
Checking Clang 11 with PVS-StudioChecking Clang 11 with PVS-Studio
Checking Clang 11 with PVS-Studio
 
Qtp Training Deepti 3 Of 44256
Qtp Training Deepti 3 Of 44256Qtp Training Deepti 3 Of 44256
Qtp Training Deepti 3 Of 44256
 
Qtp Training
Qtp Training Qtp Training
Qtp Training
 
Grails unit testing
Grails unit testingGrails unit testing
Grails unit testing
 
E catt tutorial
E catt tutorialE catt tutorial
E catt tutorial
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 

Test api

  • 1. TestApi A library of testing types, data-structures and algorithms Ivo Manolov, Microsoft
  • 2. Sharing of {Test} Code is GOOD Reduced duplication of effort Higher code quality - through evolution Lower maintenance costs Deeper, more mature coverage Etc, etc, etc(see your favorite book on code reuse) 2
  • 3. Sharing of Tests is TRICKY Need to “adapt” tests to environment Test environment dictates policy… Discovery Deployment / Distribution Execution Logging Reporting Result aggregation and reporting 3
  • 4. Sharing of Tools is TRICKY Big tools / infrastructure High adoption cost “Proprietary” stack – extension may be tricky “Hosting” costs Deployment on dev machines is frowned upon Combining tool parts may not be supported Small tools (e.g. PICT.EXE, RADAR): Deployment Cleanup Adaptation (of input / output) Upgrades SLAs 4
  • 5. Well, what CAN we share? Automated tests ARE programs A Program = reusable blocks+ domain-specific logic + config We can share the blocks! 5
  • 7. TestApi is… An API library Provides data-structures and algorithms common to testing Documented Layered Easy to deploy (xcopy) Policy-free It’s just a set of DLLs you link to We have xUnit, NUnit, MSTEST samples Licensed under Ms-PL (shared source) 7
  • 8. TestApi is notgoing to… tell you what a test is tell you how to test make a test pass/fail decision for you tell you how to log make implicit assumptions integrate with your tools (VS, Eclipse, etc.) retain execution state 8
  • 9. A Lap Around TestApi 9
  • 10. Package http://codeplex.com/testapi The ZIP contains… Binaries Sources Documentation Samples 10
  • 11. Input Simulation API Mouse.MoveTo(new Point(10, 10)); Mouse.Click(MouseButton.Left); Keyboard.Type("Hello world!"); Keyboard.Press(Key.LeftShift); Keyboard.Type("hello, capitalized world!"); Keyboard.Release(Key.LeftShift); 11 Mouse and Keyboard are wrappers of the SendInput Win32 API. They are GUI-toolkit-agnostic (Mouse works in screen coordinates, etc.)
  • 12. Visual Verification API // Take a snapshot of a window. Load a snapshot from disk. Compare. Snapshot actual = Snapshot.FromWindow(hwnd, WindowSnapshotMode.ExcludeWindowBorder); Snapshot expected = Snapshot.FromFile("Expected.png"); Snapshot difference = actual.CompareTo(expected); // Initialize a SnapshotVerifier and use it to verify the difference image Snapshot toleranceMap = Snapshot.FromFile("ExpectedImageToleranceMap.png"); SnapshotVerifier verifier = new SnapshotToleranceMapVerifier(toleranceMap); if (verifier.Verify(difference) == VerificationResult.Fail) { actual.ToFile("Actual.png", ImageFormat.Png); difference.ToFile("Difference.png", ImageFormat.Png); Console.WriteLine("Image mismatch!"); } 12 The API provides different visual verification strategies via different SnapshotVerifiers
  • 13. Variation Generation API Define a set of named parameters and constraints. var destination = new Parameter<string>("Destination") { "Whistler", "Las Vegas" }; varhotelQuality = new Parameter<int>("Hotel Quality") { 5, 4, 3, 2, 1 }; var activity = new Parameter<string>("Activity") { "gambling", "swimming", "skiing" }; var parameters = new List<ParameterBase> { destination, hotelQuality, activity}; var constraints = new List<Constraint<Variation>> { Constraint<Variation> .If(v => destination.GetValue(v) == "Las Vegas") .Then(v => activity.GetValue(v) != "skiing"), ... }; Modelmodel = new Model(parameters, constraints); foreach(varv in model.GenerateVariations(2, 1234)) { Console.WriteLine("{0} {1} {2}", v["Destination"], v["Hotel Quality"], v["Activity"]); } Create a model from them. Then query the model for variations. 13
  • 14. Variation Generation API - 2 14 // Need to go to Cleveland more often... object tag = (object)-1; double weight = 5.0; var destination = new Parameter<string>("Destination") { "Whistler", "Hawaii", "Las Vegas", new ParameterValue<string>("Cleveland", tag, weight) }; ... foreach(var v in model.GenerateVariations(2, 1234)) { switch (v.Tag as int) {...} } Parameter value weights are also supported. Parameter value tags provide a generic support for “negative” variations, etc.
  • 15. Variation Generation API - 3 class OsConfiguration { [Parameter(512, 1024, 2048)] public int Memory { get; set; } [Parameter("WinXP")] [Parameter("Vista", "Win7", Weight = 3.0F)] public string OS { get; set; } } static void CreateModel() { var model = new Model<OsConfiguration>(); foreach(OsConfigurationc in model.GenerateVariations(2)) { Console.WriteLine( "{0} {1}", c.Memory, c.OS); } 15 Models can also be constructed declaratively. The declarative syntax supports equivalence classes and weights too.
  • 16. Fault Injection API string caller = "MyApp.Main(string[])" string method = "MyApp.PrintToConsole(string)"; Exception exception = new ApplicationException("Injected!")); // Create a set of fault rules ICondition condition = BuiltInConditions.TriggerIfCalledBy(caller); IFault fault = BuiltInFaults.ThrowExceptionFault(exception); FaultRule rule = new FaultRule(method, condition, fault); // Establish a session, injecting faults defined by the rules FaultSession session = new FaultSession(rule); // Launch the target process. Observe faults. ProcessStartInfo psi = session.GetProcessStartInfo(@"yApp.exe"); Process p = Process.Start(psi); ... Under the cover, TestApi uses the CLR profiling API to modify the prologue of the intercepted method at runtime… 16
  • 17. Memory Leak Detection API // Start your process... // Perform various operations. Take memory snapshots MemorySnapshot s1 = MemorySnapshot.FromProcess(pid); ... MemorySnapshot s2 = MemorySnapshot.FromProcess(pid); // Compare snapshots. Identify possible leaks. MemorySnapshot diff = s2.CompareTo(s1); if (diff.GdiObjectCount != 0) { s1.ToFile(@"1.xml"); s2.ToFile(@"2.xml"); Console.WriteLine("Possible GDI handle leak."); } 17
  • 18. Text Generation API StringProperties sp = new StringProperties(); sp.UnicodeRanges.Add(new UnicodeRange(0x0400, 0x04FF)); sp.MinNumberOfCodePoints = sp.MaxNumberOfCodePoints = 10; string s = StringFactory.GenerateRandomString(sp, 1234); The result would be a string of 10 characters in the Cyrillic Unicode character code range, e.g. … “хѝЗКтТшщчЯ” 18
  • 19. Object Comparison API // o1 and o2 are arbitrarily complex objects... ObjectGraphFactory f = new PublicPropertyObjectGraphFactory(); ObjectComparer c = new ObjectComparer(f);   bool match = c.Compare(o1, o2); if (!match) { Console.WriteLine("The two objects do not match."); }   // you can also get a collection of mismatches... bool match = c.Compare(o1, o2, out mismatches); ... For custom comparison strategies, create your own ObjectGraphFactory. ObjectComparisonMismatch instances. 19
  • 20. Application Control API var a = new OutOfProcessApplication( new OutOfProcessApplicationSettings { ProcessStartInfo = new ProcessStartInfo(path), ApplicationImplementationFactory = new UIAutomationOutOfProcessApplicationFactory() }); a.Start(); a.WaitForMainWindow(TimeSpan.FromMilliseconds(5000)); // Perform various tests... a.Close(); The API provides both in-proc and out-of-proc application control capabilities for arbitrary applications (you may need to write your own factories) 20
  • 21. Command-Line Parsing API // Example 1: // Parse "test.exe /verbose /runId=10" CommandLineDictionary d = CommandLineDictionary.FromArguments(args) bool verbose = d.ContainsKey("verbose"); inttestId = Int32.Parse(d["testId"]); // Example 2: // Parse the same into a structure public class MyArguments { public bool? Verbose { get; set; } public int? RunId { get; set; } } MyArguments a = new MyArguments(); CommandLineParser.ParseArguments(a, args); There is also a 3rd layer, which provides capability to parse into type-safe commands to support usages such as “Test.exe run /runId=10 /verbose” 21
  • 22. In Closing… TestApi enables code reuse at the building block level. Think of it as a testing BCL. Democratic use of facilities – no strings attached Layered, decoupled Public Get Engaged! http://codeplex.com/testapi testapi@microsoft.com 22
  • 23. Q & A ? 23

Editor's Notes

  1. Sharing of test code is tricky.If you attempt to share tests, you have to adapt the tests you share to the target test run environment, which is not tricky
  2. The input simulation API provides a simple way to simulate input.The input API wrap the SendInput Win32 API under the covers.
  3. The fundamental premise of visual verification is comparing an expected image (either a master image loaded from file or a generated image) to an actual image and making a pass/fail decision based on the result from the comparison.The Snapshot class allows you to take snapshots of the screen, load snapshots from disk and compare the current Snapshot instance to another instance (generating a diff).The API also provides a family of verifiers (they all inherit from SnapshotVerifier), which use different strategies to perform verification of (most commonly a diff) Snapshot instance.
  4. Note that the API also supports weighted parameters as well as “tagged parameter values” for negative testing, etc.
  5. Of course, we support
  6. Fault injection is a code coverage technique that allows you to change the behavior of a program.TestApi provides a simple mechanism for injecting of faults in managed code at run-time.
  7. The MemorySnapshot class provides an easy way to take memory snapshots of a running process (or load saved snapshots from disk).The generated memory snapshots track all main memory metrics of a process:GdiObjectCountHandleCountPageFileBytesPageFilePeakBytesPoolNonpagedBytesPoolPagedBytesThreadCountTimestampUserObjectCountVirtualMemoryBytesVirtualMemoryPrivateBytesWorkingSetBytesWorkingSetPeakBytesWorkingSetPrivateBytes
  8. ObjectComparer is a sealed class (cannot be extended)ObjectGraphFactory is an abstract class, with a single virtual method CreateObjectGraph, which returns a GraphNode instance representing the root node of the created graph.ObjectComparisonMismatch instances have LeftObjectNode, RightObjectNode and MismatchType members.
  9. For more, see http://blogs.msdn.com/ivo_manolov/archive/2008/12/17/9230331.aspx