Search code examples
testingautomated-testse2e-testingweb-testingtestcafe

TestCafe 'dynamic' tests cases


I created a few e2e sanity tests for my current project using TestCafe. These tests are standard TestCafe tests:

fixture(`Basic checkout flow`)

test('Main Flow', async (t) => {

});

I would like to execute this test for multiple site locales and for multiple channels. i.e. I need this test to run for nl_nl, nl_be, en_gb, .. and also for channels like b2c, b2b, ...

The easiest way is to create a loop in the test itself to loop over the locales and channels, but I want to run these test concurrently.

I tried to create a function to dynamically generate these tests, but TestCafe can't seem to detect the tests then.

dynamicTest('Main Flow', async (t) => {

});

function dynamicTest(testName, testFn) => {
  const channels = ['b2c']

  channels.forEach((channel) => {
    test(`[Channel] ${channel}] ${testName}`, testFn);
  });
};

Is there a better way of doing this? The only solution I see is running the test script multiple times from Jenkins to have concurrency.

more detailed code:

import HomePage from '../../page/HomePage/HomePage';
import EnvUtil from '../../util/EnvUtil';

const wrapper = (config, testFn) => {
  config.locales.forEach(async locale =>
    config.channels.forEach(async channel => {
      const tstConfig = {
        locale,
        channel
      };

      tstConfig.env = EnvUtil.parse(tstConfig, config.args.env);
      testConfig.foo = await EnvUtil.get() // If I remove this line it works!

      testFn(config, locale, channel)
    })
  );
};

fixture(`[Feature] Feature 1`)
  .beforeEach(async t => {
    t.ctx.pages = {
      home: new HomePage(),
      ... more pages here
    };
  });

wrapper(global.config, (testConfig, locale, channel) => {
  test
    .before(async (t) => {
      t.ctx.config = testConfig;
    })
    .page(`foo.bar.com`)
    (`[Feature] [Locale: ${locale.key}] [Channel: ${channel.key}] Feature 1`, async (t) => {
      await t.ctx.pages.home.header.search(t, '3301');

      .. more test code here
    });
});

If I run it like this I get a "test is undefined" error. Is there something wrong in the way I'm wrapping "test"?


Solution

  • Using TestCafe of version 0.23.1, you can run tests imported from external libraries or generated dynamically even if the test file you provide does not contain any tests.

    You can learn more here: Run Dynamically Loaded Tests