How can we read multiple test files from a directory and run one by one in cypress?

Viewed 28

I want to integrate a function in a spec.ts file where it will read multiple xml data one by one from a directory and will repeat the tests as long as the directories length.

Is there any way to read multiple files or files name from a folder in Cypress or in JavaScript ?

2 Answers

You can use fs to read the content of a directory, and then we can use Cypress Lodash to iterate through that returned array.

import fs from 'fs';

const files = fs.readdirSync('/my/dir/');

describe('My Tests', () => {
  Cypress._.times(files.length, (index) => {
    it(`does some test for the file: ${files[index]}, () => {
      cy.readFile(files[index]).should(...);
    });
  });
});

You will need to read the file list in cypress.config.js (for Cypress version 10 and above).

const { defineConfig } = require('cypress')
const fs = require("fs");

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {

      const xmlFolder = `${__dirname}/xml-files/`;
      const files = fs.readdirSync(xmlFolder)
        .map(file => `${xmlFolder}/${file}`)     // add folder path

      config.xmlFiles = files                    // put in config for test
      return config
    }
  }
})

In the test,

describe('Creating one test for each XML file', () => {

  Cypress.config('xmlFiles')
    .forEach(fileName => {

      it(`Testing ${fileName}`, () => {

        cy.readFile(fileName)
          .then(xml => {
            ...
          })
      });
    });
})

For Cypress version 9 and below use plugins.index.js:

module.exports = (on, config) => {
  on('before:run', (spec) => {

    const xmlFolder = `${__dirname}/xml-files/`;
    const files = fs.readdirSync(xmlFolder)
      .map(file => `${xmlFolder}/${file}`)     // add folder path

    config.xmlFiles = files                    // put in config for test
  })
  return config 
}
Related