From ee28333ebdf8a3bc54a307728827cf456a0ae787 Mon Sep 17 00:00:00 2001 From: Himanshu Rai Date: Fri, 24 Oct 2025 12:19:38 +0530 Subject: [PATCH] Add playwright json report --- .github/PULL_REQUEST_TEMPLATE.MD | 1 - README.md | 36 ++-- docs/manual-testing/requirements.md | 8 +- playwright.config.ts | 1 + tests/ui.cart.spec.ts | 252 +++++++++++++++------------- tests/ui.contents.spec.ts | 188 ++++++++++++--------- 6 files changed, 265 insertions(+), 221 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.MD b/.github/PULL_REQUEST_TEMPLATE.MD index 4a6054a..e846e3e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.MD +++ b/.github/PULL_REQUEST_TEMPLATE.MD @@ -1,2 +1 @@ Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. - diff --git a/README.md b/README.md index dc21583..4b22ca4 100644 --- a/README.md +++ b/README.md @@ -37,41 +37,43 @@ Prerequisites: Node.js 20+ (with npm) ### Basic Test Execution ```bash -npm run test # Run tests in Chromium +npm run test # Run tests in Chromium npm run test-head # Run tests in headed mode ``` -### Upload testing results to QA Sphere +### Upload testing results to QA Sphere 1. Add your QA Sphere credentials to the .env file: - - ```bash - QAS_TOKEN= - # Get your token in QA Sphere -> Settings -> API Keys - QAS_URL= - # Example: https://qasdemo.eu2.qasphere.com - ``` + ```bash + QAS_TOKEN= + # Get your token in QA Sphere -> Settings -> API Keys + + QAS_URL= + # Example: https://qasdemo.eu2.qasphere.com + ``` 2. Upload results: - ```bash - npx qas-cli junit-upload --attachments junit-results/results.xml - ``` + ```bash + npx qas-cli junit-upload --attachments junit-results/results.xml # For JUnit XML + npx qas-cli playwright-json-upload --attachments playwright-report/results.json # For Playwright JSON + ``` +# Additional Commands -# Additional Commands +Different browsers: -Different browsers: ```bash npm run chromium # Run tests in Chromium npm run firefox # Run tests in Firefox -npm run webkit # Run tests in WebKit +npm run webkit # Run tests in WebKit ``` -Playwright report: +Playwright report: + ```bash -npm run play-report # Open Playwright HTML report +npm run play-report # Open Playwright HTML report ``` ## License diff --git a/docs/manual-testing/requirements.md b/docs/manual-testing/requirements.md index d34965f..d0cd326 100644 --- a/docs/manual-testing/requirements.md +++ b/docs/manual-testing/requirements.md @@ -26,9 +26,8 @@ The system shall provide a consistent, user-friendly, and accessible navigation - Today's Menu link - About Us link - Cart icon with counter -![Navigation requirement1](https://github.com/user-attachments/assets/5f7d158b-4b0d-48b9-8293-f2f79487ae6d) -![Navigation requirement2](https://github.com/user-attachments/assets/2aa8097c-3cb4-4972-9301-6a8018a52871) - + ![Navigation requirement1](https://github.com/user-attachments/assets/5f7d158b-4b0d-48b9-8293-f2f79487ae6d) + ![Navigation requirement2](https://github.com/user-attachments/assets/2aa8097c-3cb4-4972-9301-6a8018a52871) #### Navigation Behavior @@ -81,7 +80,7 @@ Display: - Theme-compliant styling - Accessibility compliance - Responsive design implementation - + ![UI Requirements1](https://github.com/user-attachments/assets/4514d7b1-1bdb-43d2-b270-1309d5323b40) ## Menu Display Requirements {#req-3-menu} @@ -105,7 +104,6 @@ Tabs: ![Menu Display Requirements1](https://github.com/user-attachments/assets/135a6b9c-d664-4e29-affb-907e17e7d604) - #### Product Display Elements: diff --git a/playwright.config.ts b/playwright.config.ts index 618cfcd..b3624f6 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -38,6 +38,7 @@ const config: PlaywrightTestConfig = { ['line'], ['html', { open: 'never' }], ['junit', { outputFile: './junit-results/results.xml' }], + ['json', { outputFile: './playwright-report/results.json' }], ], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/tests/ui.cart.spec.ts b/tests/ui.cart.spec.ts index 629a0f5..fe48406 100644 --- a/tests/ui.cart.spec.ts +++ b/tests/ui.cart.spec.ts @@ -3,127 +3,141 @@ import { Menu } from './pageobjects/menu' import { Cart } from './pageobjects/cart' import { Checkout, paymentMethods } from './pageobjects/checkout' -test('BD-023: User should see product list according the cart on the Checkout page', async ({ - page, -}) => { - const menu = new Menu(page) - await menu.goto() - - await addToCart(menu) - - const pizzaMenu = await menu.getPizzaMenu() - const drinksMenu = await menu.getOtherMenu('drinks') - const dessertsMenu = await menu.getOtherMenu('desserts') - - let expectedCartResponse = { - items: [ - { name: pizzaMenu[0].name, amount: pizzaMenu[0].price }, - { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, - { name: drinksMenu[0].name, amount: drinksMenu[0].price }, - { name: drinksMenu[1].name, amount: drinksMenu[1].price }, - { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, - ], - total: - pizzaMenu[0].price + - pizzaMenu[1].price * 2 + - drinksMenu[0].price + - drinksMenu[1].price + - dessertsMenu[0].price, +test( + 'BD-023: User should see product list according the cart on the Checkout page', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/23', + }, + }, + async ({ page }) => { + const menu = new Menu(page) + await menu.goto() + + await addToCart(menu) + + const pizzaMenu = await menu.getPizzaMenu() + const drinksMenu = await menu.getOtherMenu('drinks') + const dessertsMenu = await menu.getOtherMenu('desserts') + + let expectedCartResponse = { + items: [ + { name: pizzaMenu[0].name, amount: pizzaMenu[0].price }, + { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, + { name: drinksMenu[0].name, amount: drinksMenu[0].price }, + { name: drinksMenu[1].name, amount: drinksMenu[1].price }, + { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, + ], + total: + pizzaMenu[0].price + + pizzaMenu[1].price * 2 + + drinksMenu[0].price + + drinksMenu[1].price + + dessertsMenu[0].price, + } + + const cart = new Cart(page) + await cart.openCart() + let cartResponse = await cart.getCartItems() + expect(cartResponse).toEqual(expectedCartResponse) + + // remove items from cart and check response + + await cart.removeCartItem(1) + await cart.removeCartItem(0) + + expectedCartResponse = { + items: [ + { name: drinksMenu[0].name, amount: drinksMenu[0].price }, + { name: drinksMenu[1].name, amount: drinksMenu[1].price }, + { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, + ], + total: drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price, + } + + cartResponse = await cart.getCartItems() + expect(cartResponse).toEqual(expectedCartResponse) + + // add back items to cart again + await cart.closeCart() + await menu.switchTab('pizza') + await menu.addMenuItemToCart(1) + await menu.addMenuItemToCart(1) + + await cart.openCart() + expectedCartResponse = { + items: [ + { name: drinksMenu[0].name, amount: drinksMenu[0].price }, + { name: drinksMenu[1].name, amount: drinksMenu[1].price }, + { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, + { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, + ], + total: + drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price + pizzaMenu[1].price * 2, + } + + cartResponse = await cart.getCartItems() + expect(cartResponse).toEqual(expectedCartResponse) } - - const cart = new Cart(page) - await cart.openCart() - let cartResponse = await cart.getCartItems() - expect(cartResponse).toEqual(expectedCartResponse) - - // remove items from cart and check response - - await cart.removeCartItem(1) - await cart.removeCartItem(0) - - expectedCartResponse = { - items: [ - { name: drinksMenu[0].name, amount: drinksMenu[0].price }, - { name: drinksMenu[1].name, amount: drinksMenu[1].price }, - { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, - ], - total: drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price, - } - - cartResponse = await cart.getCartItems() - expect(cartResponse).toEqual(expectedCartResponse) - - // add back items to cart again - await cart.closeCart() - await menu.switchTab('pizza') - await menu.addMenuItemToCart(1) - await menu.addMenuItemToCart(1) - - await cart.openCart() - expectedCartResponse = { - items: [ - { name: drinksMenu[0].name, amount: drinksMenu[0].price }, - { name: drinksMenu[1].name, amount: drinksMenu[1].price }, - { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, - { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, - ], - total: - drinksMenu[0].price + drinksMenu[1].price + dessertsMenu[0].price + pizzaMenu[1].price * 2, - } - - cartResponse = await cart.getCartItems() - expect(cartResponse).toEqual(expectedCartResponse) -}) - -test('BD-022: User should place the order successfully after entering valid data in all required fields and selecting the "Cash" payment', async ({ - page, -}) => { - const menu = new Menu(page) - await menu.goto() - - await addToCart(menu) - - const pizzaMenu = await menu.getPizzaMenu() - const drinksMenu = await menu.getOtherMenu('drinks') - const dessertsMenu = await menu.getOtherMenu('desserts') - - const expectedItemsResponse = { - items: [ - { name: pizzaMenu[0].name, amount: pizzaMenu[0].price }, - { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, - { name: drinksMenu[0].name, amount: drinksMenu[0].price }, - { name: drinksMenu[1].name, amount: drinksMenu[1].price }, - { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, - ], - total: - pizzaMenu[0].price + - pizzaMenu[1].price * 2 + - drinksMenu[0].price + - drinksMenu[1].price + - dessertsMenu[0].price, +) + +test( + 'BD-022: User should place the order successfully after entering valid data in all required fields and selecting the "Cash" payment', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/22', + }, + }, + async ({ page }) => { + const menu = new Menu(page) + await menu.goto() + + await addToCart(menu) + + const pizzaMenu = await menu.getPizzaMenu() + const drinksMenu = await menu.getOtherMenu('drinks') + const dessertsMenu = await menu.getOtherMenu('desserts') + + const expectedItemsResponse = { + items: [ + { name: pizzaMenu[0].name, amount: pizzaMenu[0].price }, + { name: pizzaMenu[1].name, amount: pizzaMenu[1].price * 2 }, + { name: drinksMenu[0].name, amount: drinksMenu[0].price }, + { name: drinksMenu[1].name, amount: drinksMenu[1].price }, + { name: dessertsMenu[0].name, amount: dessertsMenu[0].price }, + ], + total: + pizzaMenu[0].price + + pizzaMenu[1].price * 2 + + drinksMenu[0].price + + drinksMenu[1].price + + dessertsMenu[0].price, + } + + const cart = new Cart(page) + await cart.openCart() + await page.waitForTimeout(1000) + await cart.checkout() + + const checkout = new Checkout(page) + const orderRes = await checkout.getOrderItems() + expect(orderRes).toEqual(expectedItemsResponse) + + const nameInput = await checkout.getNameInput() + await nameInput.fill('John Doe') + + const emailInput = await checkout.getEmailInput() + await emailInput.fill('johndoe@example.com') + + const paymentMethodSelect = await checkout.getPaymentMethodSelect() + expect(await paymentMethodSelect.locator('option').allInnerTexts()).toEqual(paymentMethods) + await paymentMethodSelect.selectOption({ label: 'Cash on Delivery' }) + + await checkout.placeOrderButton.click() } - - const cart = new Cart(page) - await cart.openCart() - await page.waitForTimeout(1000) - await cart.checkout() - - const checkout = new Checkout(page) - const orderRes = await checkout.getOrderItems() - expect(orderRes).toEqual(expectedItemsResponse) - - const nameInput = await checkout.getNameInput() - await nameInput.fill('John Doe') - - const emailInput = await checkout.getEmailInput() - await emailInput.fill('johndoe@example.com') - - const paymentMethodSelect = await checkout.getPaymentMethodSelect() - expect(await paymentMethodSelect.locator('option').allInnerTexts()).toEqual(paymentMethods) - await paymentMethodSelect.selectOption({ label: 'Cash on Delivery' }) - - await checkout.placeOrderButton.click() -}) +) const addToCart = async (menu: Menu) => { await menu.addMenuItemToCart(0) diff --git a/tests/ui.contents.spec.ts b/tests/ui.contents.spec.ts index 3093d09..193cf14 100644 --- a/tests/ui.contents.spec.ts +++ b/tests/ui.contents.spec.ts @@ -3,96 +3,126 @@ import { Welcome } from './pageobjects/welcome' import { About } from './pageobjects/about' import { Menu } from './pageobjects/menu' -test('BD-055: User should see the content according to the About Us information', async ({ - page, -}) => { - const about = new About(page) +test( + 'BD-055: User should see the content according to the About Us information', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/55', + }, + }, + async ({ page }) => { + const about = new About(page) - await about.goto() + await about.goto() - expect(await about.getHeading()).toBe('Welcome to Bistro Delivery') - expect(await about.getBody()).toContain( - "So, while you won't actually be able to order your favorite quiche or ratatouille from us," + - ' you can certainly rely on QA Sphere to deliver the tools and systems you need to ensure your software projects' + - ' are a recipe for success. Bon appétit and happy testing!' - ) -}) + expect(await about.getHeading()).toBe('Welcome to Bistro Delivery') + expect(await about.getBody()).toContain( + "So, while you won't actually be able to order your favorite quiche or ratatouille from us," + + ' you can certainly rely on QA Sphere to deliver the tools and systems you need to ensure your software projects' + + ' are a recipe for success. Bon appétit and happy testing!' + ) + } +) -test('BD-026: Correct display of blocks and buttons in the navbar', async ({ page }) => { - const welcome = new Welcome(page) - const about = new About(page) - const menu = new Menu(page) +test( + 'BD-026: Correct display of blocks and buttons in the navbar', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/26', + }, + }, + async ({ page }) => { + const welcome = new Welcome(page) + const about = new About(page) + const menu = new Menu(page) - await welcome.goto() - let navbarItems = await welcome.getNavbarItems() - expect(navbarItems).toEqual([ - { text: 'Welcome', isActive: true }, - { text: "Today's Menu", isActive: false }, - { text: 'About us', isActive: false }, - ]) + await welcome.goto() + let navbarItems = await welcome.getNavbarItems() + expect(navbarItems).toEqual([ + { text: 'Welcome', isActive: true }, + { text: "Today's Menu", isActive: false }, + { text: 'About us', isActive: false }, + ]) - await menu.goto() - navbarItems = await menu.getNavbarItems() - expect(navbarItems).toEqual([ - { text: 'Welcome', isActive: true }, - { text: "Today's Menu", isActive: false }, // bug: this should be true instead of Welcome - { text: 'About us', isActive: false }, - ]) + await menu.goto() + navbarItems = await menu.getNavbarItems() + expect(navbarItems).toEqual([ + { text: 'Welcome', isActive: true }, + { text: "Today's Menu", isActive: false }, // bug: this should be true instead of Welcome + { text: 'About us', isActive: false }, + ]) - await about.goto() - navbarItems = await about.getNavbarItems() - expect(navbarItems).toEqual([ - { text: 'Welcome', isActive: true }, - { text: "Today's Menu", isActive: false }, - { text: 'About us', isActive: false }, // bug: this should be true instead of Welcome - ]) -}) + await about.goto() + navbarItems = await about.getNavbarItems() + expect(navbarItems).toEqual([ + { text: 'Welcome', isActive: true }, + { text: "Today's Menu", isActive: false }, + { text: 'About us', isActive: false }, // bug: this should be true instead of Welcome + ]) + } +) -test('BD-038: User should see the Pizzas list by default on the Todays Menu block', async ({ - page, -}) => { - const menu = new Menu(page) - await menu.goto() +test( + 'BD-038: User should see the Pizzas list by default on the Todays Menu block', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/38', + }, + }, + async ({ page }) => { + const menu = new Menu(page) + await menu.goto() - const pizzaMenu = await menu.getPizzaMenu() - let tabs = await menu.getTabs() - expect(tabs).toEqual([ - { text: 'PIZZAS', isActive: true }, - { text: 'DRINKS', isActive: false }, - { text: 'DESSERTS', isActive: false }, - ]) - expect(pizzaMenu.length).toBeGreaterThan(0) + const pizzaMenu = await menu.getPizzaMenu() + let tabs = await menu.getTabs() + expect(tabs).toEqual([ + { text: 'PIZZAS', isActive: true }, + { text: 'DRINKS', isActive: false }, + { text: 'DESSERTS', isActive: false }, + ]) + expect(pizzaMenu.length).toBeGreaterThan(0) - const drinksMenu = await menu.getOtherMenu('drinks') - tabs = await menu.getTabs() - expect(tabs).toEqual([ - { text: 'PIZZAS', isActive: false }, - { text: 'DRINKS', isActive: true }, - { text: 'DESSERTS', isActive: false }, - ]) - expect(drinksMenu.length).toBeGreaterThan(0) + const drinksMenu = await menu.getOtherMenu('drinks') + tabs = await menu.getTabs() + expect(tabs).toEqual([ + { text: 'PIZZAS', isActive: false }, + { text: 'DRINKS', isActive: true }, + { text: 'DESSERTS', isActive: false }, + ]) + expect(drinksMenu.length).toBeGreaterThan(0) - const dessertsMenu = await menu.getOtherMenu('desserts') - tabs = await menu.getTabs() - expect(tabs).toEqual([ - { text: 'PIZZAS', isActive: false }, - { text: 'DRINKS', isActive: false }, - { text: 'DESSERTS', isActive: true }, - ]) - expect(dessertsMenu.length).toBeGreaterThan(0) -}) + const dessertsMenu = await menu.getOtherMenu('desserts') + tabs = await menu.getTabs() + expect(tabs).toEqual([ + { text: 'PIZZAS', isActive: false }, + { text: 'DRINKS', isActive: false }, + { text: 'DESSERTS', isActive: true }, + ]) + expect(dessertsMenu.length).toBeGreaterThan(0) + } +) -test('BD-052: User should see the Todays Menu block after clicking the Todays Menu button in the Welcome banner', async ({ - page, -}) => { - const welcome = new Welcome(page) +test( + 'BD-052: User should see the Todays Menu block after clicking the Todays Menu button in the Welcome banner', + { + annotation: { + type: 'test case', + description: 'https://qasdemo.eu2.qasphere.com/project/BD/tcase/52', + }, + }, + async ({ page }) => { + const welcome = new Welcome(page) - await welcome.goto() + await welcome.goto() - expect(await welcome.getHeading()).toBe('Bistro Delivery') - expect(await welcome.getBody()).toBe( - 'Elegance of French&Italian Cuisine Delivered Directly to Your Doorstep!' - ) + expect(await welcome.getHeading()).toBe('Bistro Delivery') + expect(await welcome.getBody()).toBe( + 'Elegance of French&Italian Cuisine Delivered Directly to Your Doorstep!' + ) - expect(await welcome.getGotoMenuButton()).toBe("View Today's Menu") -}) + expect(await welcome.getGotoMenuButton()).toBe("View Today's Menu") + } +)