আমার একটি কোড রয়েছে যেখানে নির্দিষ্ট পরীক্ষাগুলি সিআই পরিবেশে সর্বদা ব্যর্থ হয়। আমি পরিবেশের অবস্থার ভিত্তিতে এগুলি অক্ষম করতে চাই।
রানটাইম কার্যকর করার সময় কীভাবে প্রোগ্রামে মোচায় একটি পরীক্ষা এড়ানো যায়?
আমার একটি কোড রয়েছে যেখানে নির্দিষ্ট পরীক্ষাগুলি সিআই পরিবেশে সর্বদা ব্যর্থ হয়। আমি পরিবেশের অবস্থার ভিত্তিতে এগুলি অক্ষম করতে চাই।
রানটাইম কার্যকর করার সময় কীভাবে প্রোগ্রামে মোচায় একটি পরীক্ষা এড়ানো যায়?
উত্তর:
আপনি বর্ণনার সামনে একটি এক্স রেখে বা এটি ব্লক করে বা তার .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,
}
}
}
beforeEach
কলটি কার্যকর হলে , মোচা ভবিষ্যতের ব্যবহারের জন্য বেনামে ফাংশন ("হুক") রেকর্ড করে , যখন কলটি কার্যকর করে, মোচা তাৎক্ষণিকভাবে এটিতে প্রেরিত বেনাম ফাংশনটি সম্পাদন করে। সুতরাং সময় কার্যকর করা হয়, হুক চালানো হবে না। describe
if (runTest)
beforeEach
প্রোগ্রামমেটিকভাবে স্কিপিংয়ে টেস্টের একটি অনথিভুক্ত উপায় রয়েছে:
// 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 এ আলোচনা করা হয়েছে ।
describe
স্কিপড হিসাবে চিহ্নিত করে (যেমন সমস্ত পরীক্ষাগুলি describe
বাদ দেওয়া হয়)।
এই উত্তরটি ES6 এর জন্য কাজ করে ।
পরিবর্তে:
describe('your describe block', () => {
তুমি চাও:
(condition ? describe : describe.skip)('your describe block', () => {
শর্তসাপেক্ষে বর্ণনামূলক ব্লকের সমস্ত পরীক্ষা এড়িয়ে যায় যদি শর্তটি মিথ্যা থাকে is
বা এর পরিবর্তে:
it('your it block', () => {
তুমি চাও:
(condition ? it : it.skip)('your it block', () => {
শর্তসাপেক্ষে একটি পরীক্ষা এড়িয়ে যায় যদি শর্তটি মিথ্যা।
const contextualDescribe = shouldAvoidTests ? describe.skip : describe
করতে হবে : তারপরে আপনি এটি ব্যবহার করতে পারেন: contextualDescribe('your it block', () => {
(condition ? describe : describe.skip)('your describe block', () => {
(it)('my test', () => {})
আপনি যেমন বর্ণনা করছেন তেমন দৃশ্যের জন্য আমি মোচা থেকে রানটাইম স্কিপিং ব্যবহার করি। এটি ডক্স থেকে অনুলিপি পেষ্ট :
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')
।
if (/* skipTestCondition */) return this.skip();
- সম্পাদনা: কাজগুলি: ডি
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!");
});
});
আপনি যে শর্তগুলি পরীক্ষা করতে চান তা যদি পরীক্ষার সময় নির্ধারণ করা যায় তবে এটি কিছুটা জটিল। আপনি যদি পরীক্ষার এপিআইয়ের অংশটি কঠোরভাবে না বলে কিছু অ্যাক্সেস করতে না চান তবে আপনি এটি করতে পারেন:
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!");
});
});
আমার প্রথম উদাহরণটি টেস্টগুলিকে আনুষ্ঠানিকভাবে এড়িয়ে যাওয়া (ওরফে "মুলতুবি") হিসাবে চিহ্নিত করছিল, আমি যে পদ্ধতিটি সবে দেখিয়েছি তা কেবল আসল পরীক্ষা করা এড়াতে পারবে তবে পরীক্ষাগুলি আনুষ্ঠানিকভাবে এড়িয়ে যাওয়া হিসাবে চিহ্নিত হবে না। তারা পাস হিসাবে চিহ্নিত করা হবে। আপনি যদি এগুলিকে এড়িয়ে চলাতে চান তবে আমি পরীক্ষার এপিআইয়ের অংশটি সঠিকভাবে বলছেন না এমন অংশগুলিতে অ্যাক্সেসের কোন উপায়ই কম জানি না:
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!");
});
});
এটি "প্রোগ্রামেটিক স্কিপিং" হিসাবে যোগ্যতা অর্জন করে কিনা তা আমি নিশ্চিত নই, তবে আমাদের সিআই পরিবেশের জন্য কয়েকটি নির্দিষ্ট পরীক্ষামূলকভাবে বাছাই করতে আমি মোচার ট্যাগিং বৈশিষ্ট্যটি ব্যবহার করি ( https://github.com/mochajs/mocha/wiki/Tagging )। ইন describe()
বা it()
বার্তাগুলি, আপনি @ নো-সিআইয়ের মতো একটি ট্যাগ যুক্ত করতে পারেন। এই পরীক্ষাগুলি বাদ দিতে, আপনি আপনার প্যাকেজ.জসনে একটি নির্দিষ্ট "সিআই লক্ষ্য" সংজ্ঞায়িত করতে পারেন এবং ব্যবহার --grep
এবং --invert
প্যারামিটারের মতো:
"scripts": {
"test": "mocha",
"test-ci" : "mocha --reporter mocha-junit-reporter --grep @no-ci --invert"
}
আপনি আমার প্যাকেজ ব্যবহার করতে পারেন প্রোগ্রামগুলি পরীক্ষামূলকভাবে এড়াতে আপনি মোচা-ধরে নিতে পারেন তবে কেবল পরীক্ষার বাইরে থেকে। আপনি এটি এর মতো ব্যবহার করুন:
assuming(myAssumption).it("does someting nice", () => {});
মোচা-অনুমান কেবল তখনই আপনার পরীক্ষা চালাবে myAssumption
হয় true
, অন্যথায় এটা লাফালাফি করা হবে (ব্যবহার it.skip
একটা চমৎকার বার্তা সহ)।
আরও বিশদ উদাহরণ এখানে:
describe("My Unit", () => {
/* ...Tests that verify someAssuption is always true... */
describe("when [someAssumption] holds...", () => {
let someAssumption;
beforeAll(() => {
someAssumption = /* ...calculate assumption... */
});
assuming(someAssumption).it("Does something cool", () => {
/* ...test something cool... */
});
});
});
এটিকে ব্যবহার করে, আপনি ক্যাসকেডিং ব্যর্থতা এড়াতে পারবেন। পরীক্ষা বলুন"Does something cool"
সর্বদা ব্যর্থ হয় যখন কিছু অ্যাসেম্পশন না রাখে - তবে এই ধারণাটি ইতিমধ্যে উপরে (ইন Tests that verify someAssuption is always true"
) পরীক্ষা করা হয়েছিল ।
সুতরাং পরীক্ষার ব্যর্থতা আপনাকে কোনও নতুন তথ্য দেয় না। প্রকৃতপক্ষে, এটি এমনকি একটি মিথ্যা-ইতিবাচকও: পরীক্ষাটি ব্যর্থ হয় নি কারণ "শীতল কিছু" কাজ করে না, তবে পরীক্ষার পূর্বশর্তটি সন্তুষ্ট না হওয়ায়। আপনার সাথে mocha-assume
প্রায়শই এই জাতীয় মিথ্যা ধনাত্মকতা এড়ানো যায়।
beforeAll
হুক সমস্ত পরীক্ষার সংগ্রহ করা হয় সামনে চালানোর নিশ্চিত নয়। প্রকৃতপক্ষে, এটি কেবল পরে চালানোর খুব সম্ভবত সম্ভাবনা রয়েছে তবে এই ক্ষেত্রে assuming(someAssumption)
ইতিমধ্যে প্রাথমিক (অপরিজ্ঞাত) মানটি পাওয়া যেত। কাঙ্ক্ষিত প্রভাব অর্জনের জন্য একটি অংশে এটি অংশ মোড়ানো প্রয়োজন w
শর্তসাপেক্ষে পরীক্ষা চালানোর জন্য আমরা একটি দুর্দান্ত পরিষ্কার র্যাপার ফাংশন লিখতে পারি:
function ifConditionIt(title, test) {
// Define your condition here
return condition ? it(title, test) : it.skip(title, test);
}
এটি আপনার পরীক্ষাগুলিতে নিম্নলিখিত হিসাবে প্রয়োজনীয় এবং ব্যবহার করা যেতে পারে:
ifConditionIt('Should be an awesome test', (done) => {
// Test things
done();
});
বলুন আমি আমার প্যারামিট্রাইজড পরীক্ষাটি বাদ দিতে চেয়েছিলাম যদি আমার পরীক্ষার বিবরণে "foo" স্ট্রিং থাকে তবে আমি এটি করতাম:
// Skip parametrized test if description contains the string "foo"
(test.description.indexOf("foo") === -1 ? it : it.skip)("should test something", function (done) {
// Code here
});
// Parametrized tests
describe("testFoo", function () {
test({
description: "foo" // This will skip
});
test({
description: "bar" // This will be tested
});
});
আপনার ক্ষেত্রে, আমি বিশ্বাস করি যে আপনি যদি পরিবেশের ভেরিয়েবলগুলি পরীক্ষা করতে চান তবে আপনি নোডজেএস ব্যবহার করতে পারেন:
process.env.ENV_VARIABLE
উদাহরণস্বরূপ (সতর্কতা: আমি এই বিট কোডটি পরীক্ষা করি নি!), সম্ভবত এর মতো কিছু:
(process.env.NODE_ENV.indexOf("prod") === -1 ? it : it.skip)("should...", function(done) {
// Code here
});
আপনি ENV_VARIABLE সেট করতে পারেন যেখানে আপনি যা চাচ্ছেন তা হতে পারে এবং সেই মানটি ব্যবহার করে পরীক্ষাটি এড়িয়ে যান বা চালান। (নোডজেএস'স প্রক্রিয়া.এনভির জন্য ডকুমেন্টেশন এফওয়াইআই এখানে রয়েছে: https://nodejs.org/api/process.html#process_process_env )
আমি এই সমাধানের প্রথম অংশের জন্য সম্পূর্ণ creditণ গ্রহণ করব না, আমি উত্তরটি খুঁজে পেয়েছি এবং এটি পরীক্ষা করেছি এবং এটি এই উত্সের মাধ্যমে একটি সাধারণ শর্তের ভিত্তিতে পরীক্ষা এড়ানোর জন্য নিখুঁতভাবে কাজ করেছে: https://github.com/mochajs/mocha/issues / 591
আশাকরি এটা সাহায্য করবে! :)
এটি সত্যই মোচার বৈশিষ্ট্যগুলি ব্যবহার করছে না, বরং আমার পছন্দসই আচরণ পেতে এটি টুইট করে।
আমি আমার প্রটেক্টর মোচা পরীক্ষায় পরবর্তী কোনও 'এটি' এড়িয়ে যেতে চেয়েছিলাম এবং একটি 'এটি' ব্যর্থ হয়েছে। এর কারণ এটি ছিল যে একবার ভ্রমণের পরীক্ষার এক ধাপ ব্যর্থ হয়ে যায় এটি প্রায় নিশ্চিত ছিল যে বাকী ব্যর্থ হবে, এবং তারা একটি ব্রাউজার ব্যবহার করে যদি কোনও পৃষ্ঠাতে উপাদান উপস্থিত হওয়ার জন্য অপেক্ষা করে থাকে তবে বিল্ড সার্ভারটি হোগ করতে পারে etc.
যখন কেবল স্ট্যান্ডার্ড মোচা পরীক্ষা চালাবেন (প্রটেক্টর নয়) এটি গ্লোবাল এর আগে এবং পরে প্রতিটি হুকের সাহায্যে পরীক্ষার পিতামাতার কাছে 'স্কিপসউসবিউসিড' পতাকা সংযুক্ত করে বর্ণনা করা যেতে পারে:
beforeEach(function() {
if(this.currentTest.parent.skipSubsequent) {
this.skip();
}
});
afterEach(function() {
if (this.currentTest.state === 'failed') {
this.currentTest.parent.skipSubsequent = 'true'
}
})
প্রটেক্টর এবং মোচা দিয়ে এটি চেষ্টা করার সময় এটি 'এর' এর পরিধি পরিবর্তন হয়ে গেছে এবং উপরের কোডটি কাজ করে না। আপনি 'ত্রুটি কলিং সম্পন্ন ()' এবং প্রোটেক্টর থামার মতো একটি ত্রুটি বার্তা দিয়ে শেষ করেন।
পরিবর্তে আমি নীচের কোড দিয়ে শেষ করেছি। সবচেয়ে সুন্দর নয়, তবে এটি এই.স্কিপ () দ্বারা অবশিষ্ট পরীক্ষা ফাংশনগুলির প্রয়োগের পরিবর্তে শেষ হয় rep এটি পরে কাজ করা বন্ধ করবে যদি / যখন পরে সংস্করণগুলির সাথে মোচার অভ্যন্তরীণ পরিবর্তন হয়।
এটি মোচার ইন্টার্নালগুলি ডিবাগ করে এবং পরীক্ষা করে কিছু পরীক্ষার এবং ত্রুটির মধ্য দিয়ে সনাক্ত করা হয়েছিল ... পরীক্ষাগুলি ব্যর্থ হলে ব্রাউজারের পরীক্ষা স্যুটগুলি যত তাড়াতাড়ি সম্পন্ন করতে সহায়তা করে।
beforeEach(function() {
var parentSpec = this.currentTest.parent;
if (!parentSpec.testcount) {
parentSpec.testCount = parentSpec.tests.length;
parentSpec.currentTestIndex = 0;
} else {
parentSpec.currentTestIndex = parentSpec.currentTestIndex + 1;
}
if (parentSpec.skipSubsequent) {
parentSpec.skipSubsequent = false;
var length = parentSpec.tests.length;
var currentIndex = parentSpec.currentTestIndex;
for (var i = currentIndex + 1; i < length; i++) {
parentSpec.tests[i].fn = function() {
this.skip();
};
}
}
});
afterEach(function() {
if (this.currentTest.state === 'failed') {
this.currentTest.parent.skipSubsequent = 'true'
}
});
mocha test/ --grep <pattern>
যেমন @ ড্যানিয়েলস্টজুলস এখানে উত্তর দিয়েছেন পরীক্ষা এড়ানোর একটি উপায় আছে। @ এই বিষয়ে কর্তৃপক্ষ github.com মোচাজ আলোচনা থেকে উত্তরটি অনুলিপি করেছেন, তবে এটি মোচা কোন সংস্করণে উপলব্ধ তা সম্পর্কে কোনও তথ্য নেই।
আমি আমার প্রকল্পে মোচা পরীক্ষার কার্যকারিতা সংহত করার জন্য গ্রান্ট-মোচা-পরীক্ষা মডিউলটি ব্যবহার করছি। শেষের (এখনের জন্য) সংস্করণে জাম্পিং - 0.12.7 আমার এই মোচা সংস্করণটি 2.4.5 এ নিয়ে এসিসিপ () প্রয়োগ করে নিয়ে আসে।
সুতরাং, আমার প্যাকেজ.জসনে
"devDependencies": {
"grunt-mocha-test": "^0.12.7",
...
এবং তারপর
npm install
এবং এটি আমাকে এই হুক দিয়ে খুশি করে:
describe('Feature', function() {
before(function () {
if (!Config.isFeaturePresent) {
console.log('Feature not configured for that env, skipping...');
this.skip();
}
});
...
it('should return correct response on AB', function (done) {
if (!Config.isABPresent) {
return this.skip();
}
...
দয়া করে না। এমন একটি পরীক্ষা যা পরিবেশের জুড়ে ধারাবাহিকভাবে কাজ করে না তা আপনার বিল্ড অবকাঠামো দ্বারা স্বীকৃত হওয়া উচিত। এবং সিআই বিল্ডগুলির স্থানীয়ের তুলনায় বিভিন্ন ধরণের পরীক্ষা চালানো হলে এটি খুব বিতর্কিত হতে পারে।
এছাড়াও এটি পুনরাবৃত্তিযোগ্যতা স্ক্রু। সার্ভারে এবং স্থানীয়টিতে বিভিন্ন পরীক্ষা চালানো হলে আমি সিআই বা তদ্বিপরীত ডিভ মধ্যে ব্যর্থ এবং পরীক্ষায় অংশ নিতে পারি। কোনও জোর করে ফাংশন নেই এবং একটি ব্যর্থ বিল্ডটি দ্রুত এবং নির্ভুলভাবে সংশোধন করার আমার কাছে কোনও উপায় নেই।
শর্তসাপেক্ষে টেস্ট চালানোর পরিবর্তে আপনার যদি পরিবেশের মধ্যে পরীক্ষা বন্ধ করতে হয়, তবে আপনার পরীক্ষাগুলিতে ট্যাগ করুন এবং নির্দিষ্ট বিল্ড লক্ষ্যগুলিতে কাজ না করে এমন পরীক্ষাগুলি নির্মূল করতে একটি ফিল্টার ব্যবহার করুন। এইভাবে সবাই জানে যে কী চলছে এবং এটি তাদের প্রত্যাশাগুলি হতাশ করে। এটি প্রত্যেককে জানতে দেয় যে পরীক্ষার কাঠামোতে অসঙ্গতি রয়েছে এবং কারওর মধ্যে এমন একটি সমাধান থাকতে পারে যা সেগুলি আবার সঠিকভাবে চালিত হয়। আপনি যদি কেবল পরীক্ষার নিঃশব্দ হন তবে তারা হয়ত বুঝতে পারে না কোনও সমস্যা আছে।
this.skip()
হয়েছে । বাকি উত্তরগুলি মোচা ভি 3 + এর জন্য অপ্রচলিত