REST API testing with SpecFlow
Click here to load reader
-
Upload
aiste-stikliute -
Category
Technology
-
view
438 -
download
9
description
Transcript of REST API testing with SpecFlow
REST API testing with SpecFlowAistė Stikliūtė @ Visma Lietuva
Agenda
Why SpecFlow REST API How to
Details & tips Live demo
Bonus:other uses
of SpecFlow
Why SpecFlow• SoapUI?
• Fitnesse?
• Cucumber?
Why not…
SoapUI
Free version issues
Tests less easy to read
Thought there was no CI
Fitnesse
Works poorly with .NET
Wiki markup and tables interface is tiring
Cucumber
Yes – SpecFlow is Cucumber for .NET!
Continuous integration
BDD / Gherkin language
GIVEN book with ISBN “1-84356-028-3” is in the systemAND it’s available quantity is 9WHEN I add a book with ISBN “1-84356-028-3”THEN the book is successfully added to the listAND available qty. for book with ISBN “1-84356-028-3” is 10
The environment
Same tool as for GUI
tests (Visual Studio, C#)
Same solution as GUI tests and even the whole
system
Convenient!
Developers are
integrated!
Rest API• What it is
• Examples
• Why test it
REST API
Web architectural style with a set of constraints
Web service APIs that adhere to the constraints - RESTful
Frontend
Backend
REST APIExternal
system(s)External system(s)
Rest API: typically used HTTP methods
Resource GET PUT POST DELETE
Collection URI,such as http
://example.com/resources
Listcollection's members
Replacecollection with another collection
Create new entry in the collection
Delete the entire collection
Element URI,such as http
://example.com/resources/item17
Retrievethe member of the collection
Replace the member of the collection
Not generally used
Delete the member of the collection
Example 1
Request
GET https://eshop.com/books/14765
Response
Status: 200 OK
{ "id": “14765", “title": “Game of Thrones", “author": “George R. R. Martin", “isbn": "1-84356-028-3", “availableQty": “4"}
Example 2
Request
POST https://eshop.com/books
{ “title": “501 Spanish Verbs", “author": “C. Kendris", “isbn": "1-84750-018-7", “availableQty": “10"}
Response
Status: 200 OK
{ “id": “78953“}
Example 3
Requests
DELETE https://eshop.com/book/84523
GET https://eshop.com/admin
PUT https://eshop.com/book/24552
{ [some wrong data] }
Responses
Status: 200 OK
Status: 401 Unauthorized
Status: 500 Internal Server Error
Why test Rest API?
If used by external applications: this is your UI!
As your system layer: Can help find / isolate problems:
Security
Performance
Robustness
Functionality
May be more simple to test / automate than GUI tests
How to……write tests
Step 1: know what your API should do
Documentation
Talk to developers
Browser’s Developer tools
REST client (e.g. Postman on Chrome)
Dev tools + REST client
Step 2: write your test scenarios
ListBooks.feature
Scenario: There are no books in the systemGiven there are no books in the systemWhen I retrieve list of all booksThen I get empty list
Scenario: There are less books than fit into 1 pageScenario: There are more books than fit into 1 pageScenario: Sort booksScenario: Search for a book
Step 3: generate scenario steps
[Given(@”there are no books in the list”)]public void GivenThereAreNoBooksInTheList(){
ScenarioContext.Current.Pending();}
Step 4: implement scenario steps
Here‘s where the Rest API calls go!
Plain C# can be used or libraries // I use RestSharp
Structure your project
Project structure
Features: all features, can have subfolders
Steps: bindings of features to actions
Actions: where things happen
Helpers: among others, RestHelper.cs
Model: classes matching our API data format
App.config: holds base URI
A quick look into code: Steps & ActionsSteps
Actions
A quick look into code: Model
A quick look into code: RestHelper.cs
Step 5: run tests
Step 6: add to Continuous Integration
Details & Tips
Hooks (event bindings)
Before / after test run static
Before / after feature static
Before / after scenario
Before / after scenario block (given / when / then)
Before / after step
Step scope and reusing
Steps are global! Naming: “when I update it” “when I update the book”
Scoped bindings:
[Scope(Tag="my tag", Feature=“my feature", Scenario=“my scenario")]
Reusing step in other steps
[Given(@"(.*) is logged in")]public void GivenIsLoggedIn(string name) { Given(string.Format("the user {0} exists", name)); Given(string.Format("I log in as {0}", name));}
Table and multiline step arguments
Live Demo
BonusOther uses of SpecFlow
Behaviour /Business Driven Development
1. PO / QA writes scenarios
2. Developer writes unit/integration tests
3. Developer writes code until tests pass
BDD
Driving Selenium tests
Scenario: Successful loginGiven I am in login pageWhen I login with correct
credentialsThen I am redirected to main page
Scenario: Successful loginGiven I am at http://eshop.com/loginWhen I login with user “John” and password
“Password1”Then I am redirected to http://eshop.com/main
SpecFlow & Seleniumusing scoped bindings
[When(@"I perform a simple search on '(.*)'", Scope(Tag = “api"))]public void WhenIPerformASimpleSearchOn(string searchTerm) {
var api = new CatalogApi();actionResult = api.Search(searchTerm);
}
[When(@"I perform a simple search on '(.*)'"), Scope(Tag = "web")]public void PerformSimpleSearch(string title) {
selenium.GoToThePage("Home"); selenium.Type("searchTerm", title);
selenium.Click("searchButton");}
Test case management / Test reporting
One functional test suite? Manual
Automated API
Automated GUI
One report with test list that can be read by POs and manual QAs
management
customer
Thank you!Time for questions