How to set execution order of mocha test cases in multiple files

Javascriptnode.jsTddmocha.js

Javascript Problem Overview


I have two javascript files which contain mocha test cases.

//----------abc.js -------------

describe("abc file", function(){
  it("test 1" , function(){
    assert.equal(20 , 20); 
  });
}); 

//---------xyz.js--------------
describe("xyz file", function(){
      it("test 1" , function(){
        assert.equal(10 , 10); 
      });
    });

I have put them in a folder called test and when I execute the mocha command the first file(abc.js) is always executed before xyz.js. I thought this might be due to alphabetical ordering and renamed the files as

abc.js => xyz.js
xyz.js => abc.js

but still, the content of the xyz.js (previously abc.js) is executed first. How can I change the execution order of these test files?

Javascript Solutions


Solution 1 - Javascript

In the second file, require the first one:

--- two.js ---
require("./one")

Mocha will run the tests in the order the describe calls execute.

Solution 2 - Javascript

I follow a totally seperate solution for this.

Put all your tests in a folder named test/ and Create a file tests.js in the root directory in the order of execution

--- tests.js ---
require('./test/one.js')
require('./test/two.js')
require('./test/three.js')

And in the tests files one.js, two.js and so on write your simple mocha tests

this way if you want to run them in the order you have defined then just run mocha tests.js

Solution 3 - Javascript

Mocha has a --sort (short -S) option that sorts test files:

$ mocha --help

[...]
    -S, --sort                              sort test files
[...]

Solution 4 - Javascript

Since mocha sorts files in alphabetical order, I usually prefix my test files names with numbers, like:

  • 0 - util.js
  • 1 - something low level.js
  • 2 - something more interesting.js

etc.

In addition to being really easy to maintain (no gulp grunt or any of that nonsense, no editing your package.json...), it provides the benefit that:

  • people reading your source code get an idea of the structure of your program, starting from the less interesting parts and moving up to the business layer
  • when a test fails, you have some indication of causality (if something failed in 1 - something.js but there are no failures in 0 - base.js then it's probably the fault of the layer covered by 1 - something.js

If you're doing real unit tests of course order should not matter, but I'm rarely able to go with unit tests all the way.

Solution 5 - Javascript

If you prefer a particular order, you can list the files (in order) as command-line arguments to mocha, e.g.:

$ mocha test/test-file-1.js test/test-file-2.js

To avoid a lot of typing every time you want to run it, you could turn this into an npm script in your package.json:

{
  // ...
  "scripts": {
    "test": "mocha test/test-file-1.js test/test-file-2.js"
  }
  // ...
}

Then run your suite from the command line:

$ npm test

Or if you're using Gulp, you could create a task in your gulpfile.js:

var gulp = require('gulp');
var mocha = require("gulp-mocha");

gulp.task("test", function() {
  return gulp.src([
      "./test/test-file-1.js",
      "./test/test-file-2.js"
    ])
    .pipe(mocha());
});

Then run $ gulp test.

Solution 6 - Javascript

The way it worked for my tests to be executed in a specific order was to create a separate test.js file and then added a describe for each mocha test file I'd wanted to execute.

test.js:

describe('test file 1', function() {
  require('./test1.js')
})

describe('test file 2', function() {
  require('./test2.js')
})

Then simply run mocha test.js

Solution 7 - Javascript

I am exporting an array with all required files and that is the way I tell mocha the order of execution through index.js file in the folder with all my test files:

const Login = require('../login');
const ChangeBudgetUnit = require('./changeBudgetUnit');
const AddItemsInCart = require('./addItemsInCart'); 

// if the order matters should export array, not object
module.exports = [
    Login,
    ChangeBudgetUnit,
    AddItemsInCart
];

Solution 8 - Javascript

mocha-steps allows you to write tests that run in a specific sequence, aborting the run at the first failure. It provides a drop-in replacement for it, called steps.

Example usage:

describe('my smoke test', async () => {
  step('login', async () => {})
  step('buy an item', async () => throw new Error('failed'))
  step('check my balance', async () => {})
  xstep('temporarily ignored', async () => {})
})

The repo hasn't seen much activity in three years, but it works fine with Mocha 9.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiontnishadaView Question on Stackoverflow
Solution 1 - JavascriptPeter LyonsView Answer on Stackoverflow
Solution 2 - JavascriptPriyanshu JindalView Answer on Stackoverflow
Solution 3 - JavascriptLouisView Answer on Stackoverflow
Solution 4 - JavascriptdjfmView Answer on Stackoverflow
Solution 5 - JavascriptDavid SchneiderView Answer on Stackoverflow
Solution 6 - JavascriptAndré MarcelinoView Answer on Stackoverflow
Solution 7 - Javascriptuser12342217View Answer on Stackoverflow
Solution 8 - JavascriptaalaapView Answer on Stackoverflow