2. Who am I ?
• Technical Test Consultant
• Trainer test automation
• Involved in R&D activities
• Blogs:
– http://selenium.polteq.com
– http://www.rdekleijn.nl
3. Agenda
1. Web Service introduction
2. What's in it for testers ?
3. Testing a Web Service
4. Cases
4. Agenda
1. Web Service introduction
2. What's in it for testers ?
3. Testing a Web Service
4. Cases
5. What is a Web Service ?
A Web service is a software component that can be
accessed by another application (such as a client, a
server or another Web service) through the use of
generally available, ubiquitous protocols and
transports, such as Hypertext Transport Protocol
(HTTP).
[Gartner]
8. Web Service Based Architecture
• Scalable
• Support for any application type
9. Web Service Based Architecture
• Scalable
• Support for any application type
• Language independent
10. Web Service Based Architecture
• Scalable
• Support for any application type
• Language independent
• Central business logic
11. Web Service Based Architecture
• Scalable
• Support for any application type
• Language independent
• Central business logic
• Standardised integration
13. Different types
• Protocols: WSDL / SOAP / REST
• REST (Representational State Transfer)
– Defined by HTTP interface
14. Different types
• Protocols: WSDL / SOAP / REST
• REST (Representational State Transfer)
– Defined by HTTP interface
– Support of basic application methods (CRUD):
• POST -> create new resource
• GET -> retrieve resources
• PUT -> replace existing resource
• Delete -> remove a resource
19. How it works...
• Request messages are send to a specific endpoint
• Messages are mostly XML or JSON fragments
• Client can optionally set headers
20. Agenda
1. Web Service introduction
2. What's in it for testers ?
3. Testing a Web Service
4. Cases
21. Benefits for a tester
• Less brittle tests
– No GUI involved, no browser time-outs
22. Benefits for a tester
• Less brittle tests
– No GUI involved, no browser time-outs
• Testing can start in an early phase
23. Benefits for a tester
• Less brittle tests
– No GUI involved, no browser time-outs
• Testing can start in an early phase
• No access to the code required (might be benefitial
though)
38. Pitfalls
• Using performance test tools
– Hard to use pre/post conditions
– Hard to create maintainable scripts
– Hard to combine testtypes
39. Pitfalls
• Using performance test tools
– Hard to use pre/post conditions
– Hard to create maintainable scripts
– Hard to combine testtypes
– Hard to make complex assertions
40. Pitfalls
• Using performance test tools
– Hard to use pre/post conditions
– Hard to create maintainable scripts
– Hard to combine testtypes
– Hard to make complex assertions
– Limited flexibility in creating test suites
42. General advice
• Use a programming language
– IDE features
• Auto-completion, refactoring
43. General advice
• Use a programming language
– IDE features
• Auto-completion, refactoring
– Apply design patterns
• Make it maintainable and DRY (don’t repeat yourself)
44. General advice
• Use a programming language
– IDE features
• Auto-completion, refactoring
– Apply design patterns
• Make it maintainable and DRY (don’t repeat yourself)
– Flexible pre/post conditions
45. General advice
• Use a programming language
– IDE features
• Auto-completion, refactoring
– Apply design patterns
• Make it maintainable and DRY (don’t repeat yourself)
– Flexible pre/post conditions
– Combine your Selenium tests with web service tests
46. Tools you can use
• Jersey
– Making REST requests
• Jackson
– JSON processor
• JAXB
– XML processor
• JsonPath
– Extract parts of a JSON document
47. Tools you can use
• TestNG
– Java testing framework
• XMLUnit
– Assertions for XML, validate against XSD schema
• Hamcrest
– General matcher library
48. Agenda
1. Web Service introduction
2. What's in it for testers ?
3. Testing a Web Service
4. Cases
49. Case 1
Imagine you work for a Dutch Railway company. They
decide to create a public API, so developers can embed
railway information into their application.
You (as a tester) have to test the service.
65. Create POJO (1)
POJO = Plain Old Java Object (nothing special)
- Create a class
- Implement fields (corresponding to XML elements)
- Generate getters/setters
- Map Getters to XML elements
- By annotations
In eclipse:
Right-click on the class file -> Source -> Generate Getters/Setters
66. Create POJO (2)
@XmlRootElement(name = "ActueleVertrekTijden")
public class ActueleVertrekTijden {
private List<VertrekkendeTrein> vertrekkendeTrein;
@XmlElement(name = "VertrekkendeTrein")
public List<VertrekkendeTrein> getVertrekkendeTrein() {
return vertrekkendeTrein;
}
public void setVertrekkendeTrein(List<VertrekkendeTrein>
vertrekkendeTrein) {
this.vertrekkendeTrein = vertrekkendeTrein;
}
}
67. Create POJO (2)
@XmlRootElement(name = "ActueleVertrekTijden")
public class ActueleVertrekTijden {
private List<VertrekkendeTrein> vertrekkendeTrein;
@XmlElement(name = "VertrekkendeTrein")
public List<VertrekkendeTrein> getVertrekkendeTrein() {
return vertrekkendeTrein;
}
public void setVertrekkendeTrein(List<VertrekkendeTrein>
vertrekkendeTrein) {
this.vertrekkendeTrein = vertrekkendeTrein;
}
}
68. Create POJO (2)
@XmlRootElement(name = "ActueleVertrekTijden")
public class ActueleVertrekTijden {
private List<VertrekkendeTrein> vertrekkendeTrein;
@XmlElement(name = "VertrekkendeTrein")
public List<VertrekkendeTrein> getVertrekkendeTrein() {
return vertrekkendeTrein;
}
public void setVertrekkendeTrein(List<VertrekkendeTrein>
vertrekkendeTrein) {
this.vertrekkendeTrein = vertrekkendeTrein;
}
}
69. Create POJO (3)
public class VertrekkendeTrein {
private int ritNummer;
private String vertrekTijd;
private String eindBestemming;
private String treinSoort;
private String routeTekst;
private String vervoerder;
private String vertrekSpoor;
@XmlElement(name = "RitNummer")
public int getRitNummer() {
return ritNummer;
}
public void setRitNummer(int ritNummer) {
this.ritNummer = ritNummer;
}
70. Create POJO (3)
public class VertrekkendeTrein {
private int ritNummer;
private String vertrekTijd;
private String eindBestemming;
private String treinSoort;
private String routeTekst;
private String vervoerder;
private String vertrekSpoor;
@XmlElement(name = "RitNummer")
public int getRitNummer() {
return ritNummer;
}
public void setRitNummer(int ritNummer) {
this.ritNummer = ritNummer;
}
71. Create POJO (3)
public class VertrekkendeTrein {
private int ritNummer;
private String vertrekTijd;
private String eindBestemming;
private String treinSoort;
private String routeTekst;
private String vervoerder;
private String vertrekSpoor;
@XmlElement(name = "RitNummer")
public int getRitNummer() {
return ritNummer;
}
public void setRitNummer(int ritNummer) {
this.ritNummer = ritNummer;
}
<RitNummer>
<VertrekTijd>
<EindBestemming>
<TreinSoort>
<RouteTekst>
<Vervoerder>
<VertrekSpoor>
72. Create POJO (3)
public class VertrekkendeTrein {
private int ritNummer;
private String vertrekTijd;
private String eindBestemming;
private String treinSoort;
private String routeTekst;
private String vervoerder;
private String vertrekSpoor;
@XmlElement(name = "RitNummer")
public int getRitNummer() {
return ritNummer;
}
public void setRitNummer(int ritNummer) {
this.ritNummer = ritNummer;
}
<RitNummer>
<VertrekTijd>
<EindBestemming>
<TreinSoort>
<RouteTekst>
<Vervoerder>
<VertrekSpoor>
77. Handle Errors
<error>
<message>No station found for input ecvve</message>
</error>
if(xml.contains("error")){
// parse to error object
} else if(xml.contains("name")){
// parse to different object
}
78. Conclusion
If you want something that is:
– Easy to maintain
– Flexible
Use a programming language for your automated
testing.
80. Thank you!
Source available on GitHub:
https://github.com/roydekleijn/webservicetests
Book: https://leanpub.com/LearningSelenium/
Twitter: https://twitter.com/TheWebTester
LinkedIn: http://www.linkedin.com/in/roydekleijn
Website: http://rdekleijn.nl
Get your FREE copy using
coupon code: TADNL2013
(coupon code valid for 2 months)
Editor's Notes
Web Services make it possible to expose application functionality to the out-side world using a standardized protocol. It’s more frequently used these days to enable direct interaction between applications, so multiple applications can use the same web services. It has to be good! In this track you will see how you can develop a structured framework to create maintainable/reusable functional automated web service tests.
Technisch test specialistIk geef twee testautomatiserings trainingenEn daarnaast ben ik betrokken bij enkele innovatie projecten binnen polteqTot slot onderhoud ik 2 blogs:Op selenium.polteq.com staan Selenium gerelateerde tutorialsOp mijn persoonlijk blog staan test-gerelateerde artikellen
http://www.slideshare.net/cesare.pautasso/some-rest-design-patterns-and-antipatterns?from_search=4http://www.autotestguy.com/archives/design_patterns/index.htmlDesign Patterns -> have to researchClient c = Client.create(); WebResource w = c.resource("http://host/path"); String s = w.header("name", "value").get(String.class); or you can use client filter as well: Client c = Client.create(); c.addFilter(new ClientFilter() { @Override public ClientResponse handle(ClientRequestcr) throws ClientHandlerException { cr.getHeaders(); // do what you want return getNext().handle(cr); } });
http://www.slideshare.net/cesare.pautasso/some-rest-design-patterns-and-antipatterns?from_search=4http://www.autotestguy.com/archives/design_patterns/index.htmlDesign Patterns -> have to researchClient c = Client.create(); WebResource w = c.resource("http://host/path"); String s = w.header("name", "value").get(String.class); or you can use client filter as well: Client c = Client.create(); c.addFilter(new ClientFilter() { @Override public ClientResponse handle(ClientRequestcr) throws ClientHandlerException { cr.getHeaders(); // do what you want return getNext().handle(cr); } });
Application contains all business logic and can access the database directly.If you build a second application with more-or-less the same functionality, then you need to copy all businnes logic.
By introducing a web service based archticture we try to make it more scalable and accesible for any application type
By introducing a web service based archticture we try to make it more scalable and accesible for any application type
By introducing a web service based archticture we try to make it more scalable and accesible for any application type
By introducing a web service based archticture we try to make it more scalable and accesible for any application type
By introducing a web service based archticture we try to make it more scalable and accesible for any application type
Application contains less business logic. It’s split over multiple services.There is a agreement on the messages which can be send. The response formats are also known.
Application contains less business logic. It’s split over multiple services.There is a agreement on the messages which can be send. The response formats are also known.
Why not using Jmeter:Hard to perform pre/post conditionsHard to create maintainable scriptsHard to combin tests (Use webservice and verify on website)Hard to make complex asertions (complex JSON objects)Less flexibility in creating test suites
http://www.slideshare.net/cesare.pautasso/some-rest-design-patterns-and-antipatterns?from_search=4http://www.autotestguy.com/archives/design_patterns/index.htmlDesign Patterns -> have to researchClient c = Client.create(); WebResource w = c.resource("http://host/path"); String s = w.header("name", "value").get(String.class); or you can use client filter as well: Client c = Client.create(); c.addFilter(new ClientFilter() { @Override public ClientResponse handle(ClientRequestcr) throws ClientHandlerException { cr.getHeaders(); // do what you want return getNext().handle(cr); } });
NS applicationImagine you work for a Dutch Railway company. They decided to develop a public API, so developers can embed railway information into their application.
NS applicationImagine you work for a Dutch Railway company. They decided to develop a public API, so developers can embed railway information into their application.