DEV Community

Claradev32
Claradev32

Posted on

Advanced Topics in E2E Testing Introduction

End-to-end (E2E) testing is essential for ensuring that your application works correctly from the user's perspective. This guide will dive into advanced topics in E2E testing, including testing single-page applications (SPAs), progressive web apps (PWAs), mobile applications with Appium, visual regression testing, accessibility testing, and security testing.

Prerequisites

To follow along with this guide, you should have Node.js and npm installed. Additionally, you'll need to install Cypress for E2E testing:

npm install --save-dev cypress
Enter fullscreen mode Exit fullscreen mode

Testing Single-Page Applications (SPAs)

SPAs are web applications that load a single HTML page and dynamically update content as the user interacts with the app. E2E testing for SPAs focuses on ensuring that navigation and interactions work seamlessly.

Setting Up Cypress for SPAs

First, create a file named cypress.config.js:

// cypress.config.js
module.exports = {
  e2e: {
    setupNodeEvents(on, config) {
      // implement node event listeners here
    },
    baseUrl: 'http://localhost:3000',
  },
};
Enter fullscreen mode Exit fullscreen mode

Next, create a file named cypress/e2e/spa.spec.js and add the code snippets below:

// cypress/e2e/spa.spec.js
describe('SPA Testing', () => {
  it('should navigate to different pages', () => {
    cy.visit('/');
    cy.get('a[href="/about"]').click();
    cy.url().should('include', '/about');
    cy.get('h1').should('contain', 'About Us');
  });

  it('should load dynamic content', () => {
    cy.visit('/products');
    cy.get('.product').should('have.length.greaterThan', 0);
  });
});
Enter fullscreen mode Exit fullscreen mode

In the spa.spec.js file, we visit the home page and test navigation to the "About Us" page. We also test that dynamic content (products) loads correctly.

Testing Progressive Web Apps (PWAs)

PWAs are web applications that offer a native app-like experience. Testing PWAs involves checking for features like offline support, service workers, and push notifications.

Setting Up Cypress for PWAs

First, create a file named cypress/e2e/pwa.spec.js and add the code snippet:

// cypress/e2e/pwa.spec.js
describe('PWA Testing', () => {
  it('should load the service worker', () => {
    cy.visit('/');
    cy.window().then((win) => {
      expect(win.navigator.serviceWorker.controller).to.not.be.null;
    });
  });

  it('should work offline', () => {
    cy.visit('/');
    cy.get('h1').should('contain', 'Home');

    cy.exec('npm run offline'); // Custom command to simulate offline mode
    cy.reload();
    cy.get('h1').should('contain', 'Home'); // Content should still be available
  });

  it('should show push notifications', () => {
    cy.visit('/');
    cy.window().then((win) => {
      win.Notification.requestPermission().then((permission) => {
        expect(permission).to.equal('granted');
      });
    });
  });
});
Enter fullscreen mode Exit fullscreen mode

In the pwa.spec.js file, we test that the service worker loads, the app works offline, and push notifications are enabled.

Testing Mobile Applications with Appium

Appium is an open-source tool for automating mobile applications. It supports both Android and iOS.

Setting Up Appium

First, install Appium and the necessary drivers:

npm install -g appium
npm install -g appium-doctor
appium-doctor --android
appium-doctor --ios
Enter fullscreen mode Exit fullscreen mode

Writing Tests for Mobile Apps

Create a file named mobile-app.spec.js and add the code below:

// mobile-app.spec.js
const wdio = require('webdriverio');

const opts = {
  port: 4723,
  capabilities: {
    platformName: 'Android',
    platformVersion: '9',
    deviceName: 'Android Emulator',
    app: '/path/to/your/app.apk',
    automationName: 'UiAutomator2'
  }
};

describe('Mobile App Testing', () => {
  let client;

  beforeAll(async () => {
    client = await wdio.remote(opts);
  });

  afterAll(async () => {
    await client.deleteSession();
  });

  it('should open the app and display the home screen', async () => {
    const homeScreen = await client.$('~HomeScreen');
    expect(await homeScreen.isDisplayed()).toBe(true);
  });

  it('should navigate to the settings screen', async () => {
    const settingsButton = await client.$('~SettingsButton');
    await settingsButton.click();
    const settingsScreen = await client.$('~SettingsScreen');
    expect(await settingsScreen.isDisplayed()).toBe(true);
  });
});
Enter fullscreen mode Exit fullscreen mode

In the mobile-app.spec.js file, we test opening the app and navigating to the settings screen using Appium.

Visual Regression Testing

Visual regression testing ensures that your application's UI looks as expected and detects any unintended changes.

Setting Up Cypress for Visual Testing

First, install the necessary plugins:

npm install --save-dev cypress-image-snapshot
Enter fullscreen mode Exit fullscreen mode

Next, create a file named cypress/support/index.js and add this code:

// cypress/support/index.js
import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command';
addMatchImageSnapshotCommand();
Enter fullscreen mode Exit fullscreen mode

Writing Visual Regression Tests

Create a file named cypress/e2e/visual.spec.js:

// cypress/e2e/visual.spec.js
describe('Visual Regression Testing', () => {
  it('should display the homepage correctly', () => {
    cy.visit('/');
    cy.matchImageSnapshot();
  });

  it('should display the about page correctly', () => {
    cy.visit('/about');
    cy.matchImageSnapshot();
  });
});
Enter fullscreen mode Exit fullscreen mode

In the visual.spec.js file, we take screenshots of the homepage and the about page to compare against baseline images.

Accessibility Testing

Accessibility testing ensures that your application is usable by people with disabilities.

Setting Up Cypress for Accessibility Testing

First, install the necessary plugins with the command below:

npm install --save-dev cypress-axe
Enter fullscreen mode Exit fullscreen mode

Next, create a file named cypress/support/index.js and add the code snippet:

// cypress/support/index.js
import 'cypress-axe';
Enter fullscreen mode Exit fullscreen mode

Writing Accessibility Tests

Create a file named cypress/e2e/accessibility.spec.js and add the code snippet below:

// cypress/e2e/accessibility.spec.js
describe('Accessibility Testing', () => {
  it('should have no detectable a11y violations on load', () => {
    cy.visit('/');
    cy.injectAxe();
    cy.checkA11y();
  });

  it('should have no detectable a11y violations on the about page', () => {
    cy.visit('/about');
    cy.injectAxe();
    cy.checkA11y();
  });
});
Enter fullscreen mode Exit fullscreen mode

In the accessibility.spec.js file, we use cypress-axe to check for accessibility violations on the homepage and the about page.

Security Testing

Security testing ensures that your application is protected against common vulnerabilities.

Setting Up a Security Testing Environment

First, install the necessary plugins with the command below:

npm install --save-dev cypress
Enter fullscreen mode Exit fullscreen mode

Writing Security Tests

Create a file named cypress/e2e/security.spec.js:

// cypress/e2e/security.spec.js
describe('Security Testing', () => {
  it('should protect against XSS attacks', () => {
    cy.visit('/login');
    cy.get('input[name="username"]').type('<script>alert("XSS")</script>');
    cy.get('input[name="password"]').type('password');
    cy.get('button[type="submit"]').click();
    cy.on('window:alert', (str) => {
      expect(str).not.to.equal('XSS');
    });
  });

  it('should protect against SQL injection', () => {
    cy.visit('/login');
    cy.get('input[name="username"]').type('admin\'--');
    cy.get('input[name="password"]').type('password');
    cy.get('button[type="submit"]').click();
    cy.url().should('not.include', '/admin');
  });
});
Enter fullscreen mode Exit fullscreen mode

In the security.spec.js file, we test for XSS and SQL injection vulnerabilities by attempting to inject malicious scripts and SQL commands into the login form.

Conclusion

End-to-end testing is a comprehensive approach to ensuring your application functions correctly for end-users. In this guide, we covered advanced E2E testing topics, including:

  • Testing Single-Page Applications (SPAs): Ensuring smooth navigation and dynamic content loading.
  • Testing Progressive Web Apps (PWAs): Verifying offline capabilities, service workers, and push notifications.
  • Testing Mobile Applications with Appium: Automating tests for Android and iOS apps. Visual Regression Testing: Detecting unintended UI changes.
  • Accessibility Testing: Ensuring usability for people with disabilities.
  • Security Testing: Protecting against common vulnerabilities like XSS and SQL injection.

By incorporating these testing strategies, you can ensure your application is robust, accessible, and secure. Happy testing!

Top comments (0)