Lets imagine that we need to run the same tests, for example, on web and mobile. There are several solutions for this:
- Develop 2 different solutions for this. One for web and another for mobile.
- One solution. Try to play around locators and many "ifs".
- One solution, but use interfaces and different implementations for them.
Lets talk about the last one approach.
This is just an example. Some functionality may not work properly.
- WebApp: Souce demo
- Mobile App: Souce mobile app
This is simple shop with simple functionality.
Lets get all big steps that user can do with application:
- Login
- Main page:
- Add product to cart
- Remove product from cart
- Sort products
- Go to product
- Get numbers of product that are in cart
- Product page:
- Get info about product
- Back to Main page
- Add product to cart
- Remove product from cart
- Cart Page
- Remove product from cart
- Begin Checkout process
- Return to Main page
- Checkout process. This is like a Wizard with many pages
- Insert info about buyer
- Get info about the order(prices, total price etc.)
- Finish checkout process
So as you can see there are many abstract steps regardless of where these steps are doing: On Web or Mobile
Now we can create interfaces to describe all this steps for different parts of application. Fo example for Cart steps
public interface ICart extends IApplication{ IAllItems continueShopping(); List<ProductItem> getAllItemsInCart(); ICart removeItemFromCart(String cartName); ICheckOut checkout(); }
IAllItems, ProductItem, ICheckOut etc. - classes similar to ICart
For example for Web app ICart will be something like this:
public class WebCart extends WebApplication implements ICart { CartPage cartPage = new CartPage(); @Override public IAllItems continueShopping() { cartPage.continueShopping(); return new WebAllItems(); } @Override public List<ProductItem> getAllItemsInCart() { return cartPage.getProductItemsList(); } @Override public ICart removeItemFromCart(String productName) { cartPage.removeProductFromCart(productName); return this; } @Override public ICheckOut checkout() { cartPage.checkout(); return new WebCheckOut(); } }
CartPage - this is page for Web application with its own functionality. The same one we will create for the Mobile app
The structure will be like:
In this project I use:
- App Factory to init application
- Android driver provider this is approach for init android driver with Selenide
- Different POJOs and support classes
Now lets take a look on tests.
- Base test class
public IApplication application; @BeforeClass public void beforeSuite(){ application = AppFactory.initApp(); }
As you can see I use IApplication interface. Depending on environment you will get corresponding instance
See App Factory
The test itself:
public class CartTests extends BaseTest { @Test public void addItemToCartTest() { String itemName = "Sauce Labs Backpack"; Integer productsCountInCart = application .goToApp() .login("standard_user", "secret_sauce") .addProductToCart(itemName) .getProductsCountInCart(); assertThat(productsCountInCart).isEqualTo(1); ICart iCart = application.goToCart(); ProductItem productItem = iCart .getAllItemsInCart() .get(0); assertThat(productItem.itemName()) .isEqualTo(itemName); iCart .checkout() .enterInfoForCheckout("some", "some", "Some") .continueCheckOut() .finish() .goToItems() .openMenu() .logout(); } }
So as you can see tests do not depend on environment.
-
Run on web env:
mvn clean -DwhereToRun=web testOR
mvn clean -DwhereToRun=web -Dtest=* test -
For mobile:
- Download and install Appium server
- Download and install Android studio and install android SDK and create Emulator for tests. I installed Android 11 sdk (x86_64) and create emulator using this sdk(Pixel_4_API_30)
- Run Appium server
- Run newly created emulator
This is just an example!!!!
