[mocha] 프로그래밍 방식으로 모카에서 테스트를 건너 뛰는 방법은 무엇입니까?

CI 환경에서 특정 테스트가 항상 실패하는 코드가 있습니다. 환경 조건에 따라 비활성화하고 싶습니다.

런타임 실행 중에 프로그래밍 방식으로 모카에서 테스트를 건너 뛰는 방법은 무엇입니까?



답변

describe 또는 it 블록 앞에 x를 배치하거나 .skip뒤에 배치하여 테스트를 건너 뛸 수 있습니다 .

xit('should work', function (done) {});

describe.skip('features', function() {});

테스트를 수행하여 단일 테스트를 실행할 수도 있습니다 .only. 예를 들어

describe('feature 1', function() {});
describe.only('feature 2', function() {});
describe('feature 3', function() {});

이 경우 기능 2 블록 만 실행됩니다.

프로그래밍 방식으로 테스트를 건너 뛸 수있는 방법은 없지만 beforeEach명령문 에서 일종의 검사를 수행하고 플래그가 설정된 경우에만 테스트를 실행할 수 있습니다.

beforeEach(function(){
    if (wrongEnvironment){
        runTest = false
    }
}

describe('feature', function(){
    if(runTest){
         it('should work', function(){
            // Test would not run or show up if runTest was false,
         }
    }
}


답변

프로그래밍 방식으로 테스트를 건너 뛰는 문서화되지 않은 방법이 있습니다.

// test.js

describe('foo', function() {
  before(function() {
    this.skip();
  });

  it('foo', function() {
    // will not run
    console.log('This will not be printed');
  });
});

달리는:

$ mocha test.js


  foo
    - foo


  0 passing (9ms)
  1 pending

이것은 https://github.com/mochajs/mocha/issues/1901 에서 논의됩니다 .


답변

이 답변은 ES6에서 작동합니다 .

대신에:

describe('your describe block', () => {

당신이 원하는 :

(condition ? describe : describe.skip)('your describe block', () => {

조건이 거짓이면 설명 블록의 모든 테스트를 조건부로 건너 뜁니다.

또는 대신 :

it('your it block', () => {

당신이 원하는 :

(condition ? it : it.skip)('your it block', () => {

조건이 거짓 인 경우 조건부로 하나의 테스트를 건너 뜁니다.


답변

설명하는 것과 동일한 시나리오에서 Mocha에서 런타임 건너 뛰기를 사용합니다. 문서 의 사본 붙여 넣기입니다 .

it('should only test in the correct environment', function() {
  if (/* check test environment */) return this.skip();

  // make assertions
});

보시다시피 환경에 따른 테스트를 건너 뜁니다. 내 자신의 상태는 if(process.env.NODE_ENV === 'continuous-integration')입니다.


답변

테스트를 건너 뛰려면 describe.skip또는it.skip

describe('Array', function() {
  it.skip('#indexOf', function() {
    // ...
  });
});

사용할 수있는 테스트를 포함 describe.only하거나it.only


describe('Array', function() {
  it.only('#indexOf', function() {
    // ...
  });
});

https://mochajs.org/#inclusive-tests 에서 자세한 정보


답변

프로그래밍 방식으로 테스트를 건너 뛰려는 방법에 따라 다릅니다. 테스트 코드를 실행 하기 전에 건너 뛰기 조건을 결정할 수 있으면 조건에 따라 호출 it하거나 it.skip필요에 따라 호출 할 수 있습니다 . 예를 들어 환경 변수 ONE가 임의의 값으로 설정된 경우 일부 테스트를 건너 뜁니다 .

var conditions = {
    "condition one": process.env["ONE"] !== undefined
    // There could be more conditions in this table...
};

describe("conditions that can be determined ahead of time", function () {
    function skip_if(condition, name, callback) {
        var fn = conditions[condition] ? it.skip: it;
        fn(name, callback);
    };

    skip_if("condition one", "test one", function () {
        throw new Error("skipped!");
    });

    // async.
    skip_if("condition one", "test one (async)", function (done) {
        throw new Error("skipped!");
    });

    skip_if("condition two", "test two", function () {
        console.log("test two!");
    });

});

확인하려는 조건을 테스트 할 때만 확인할 수 있으면 좀 더 복잡합니다. 테스트 API의 일부를 엄격하게 말하지 않는 것에 액세스하지 않으려면 다음을 수행하십시오.

describe("conditions that can be determined at test time", function () {
    var conditions = {};
    function skip_if(condition, name, callback) {
        if (callback.length) {
            it(name, function (done) {
                if (conditions[condition])
                    done();
                else
                    callback(done);
            });
        }
        else {
            it(name, function () {
                if (conditions[condition])
                    return;
                callback();
            });
        }
    };

    before(function () {
        conditions["condition one"] = true;
    });

    skip_if("condition one", "test one", function () {
        throw new Error("skipped!");
    });

    // async.
    skip_if("condition one", "test one (async)", function (done) {
        throw new Error("skipped!");
    });

    skip_if("condition two", "test two", function () {
        console.log("test two!");
    });

});

첫 번째 예제는 테스트를 공식적으로 건너 뛴 것으로 표시하는 반면 (일명 “보류 중”) 방금 보여준 방법은 실제 테스트를 수행하지 않고 테스트는 공식적으로 건너 뛴 것으로 표시되지 않습니다. 합격으로 표시됩니다. 절대로 건너 뛰기를 원한다면 테스트 API의 일부를 올바르게 말하지 않는 부분에 액세스하는 방법이 부족합니다.

describe("conditions that can be determined at test time", function () {
    var condition_to_test = {}; // A map from condition names to tests.
    function skip_if(condition, name, callback) {
        var test = it(name, callback);
        if (!condition_to_test[condition])
            condition_to_test[condition] = [];
        condition_to_test[condition].push(test);
    };

    before(function () {
        condition_to_test["condition one"].forEach(function (test) {
            test.pending = true; // Skip the test by marking it pending!
        });
    });

    skip_if("condition one", "test one", function () {
        throw new Error("skipped!");
    });

    // async.
    skip_if("condition one", "test one (async)", function (done) {
        throw new Error("skipped!");
    });

    skip_if("condition two", "test two", function () {
        console.log("test two!");
    });

});


답변

이것이 “프로그래밍 건너 뛰기”인지 여부는 확실하지 않지만 CI 환경에 대한 특정 테스트를 선택적으로 건너 뛰려면 Mocha의 태깅 기능 ( https://github.com/mochajs/mocha/wiki/Tagging )을 사용합니다. 에서 describe()또는 it()메시지, 당신은 @없는 CI 같은 태그를 추가 할 수 있습니다. 이러한 테스트를 제외하기 위해 package.json에 특정 “ci 대상”을 정의하고 다음 --grep--invert같은 매개 변수를 사용합니다 .

"scripts": {
  "test": "mocha",
  "test-ci" : "mocha --reporter mocha-junit-reporter --grep @no-ci --invert"
}