mocha.js সহ একাধিক ফাইল থেকে পরীক্ষায় যোগদান


88

আমি এক ফাইলের একাধিক ফাইল থেকে সমস্ত পরীক্ষায় যোগদানের চেষ্টা করছি, এরকম কিছু:

  describe('Controllers', function() {
    describe('messages.js', function() {
      require('./controllertests/messages').test(options);
    })
    describe('users.js', function() {
      require('./controllertests/users').test(options);
    })
  })

আমি পুরোপুরি নিশ্চিত যে এটি পরীক্ষায় যোগদানের সর্বোত্তম উপায় নয়, আমি কীভাবে এটি করতে পারি তার কয়েকটি সুনির্দিষ্ট উদাহরণ পেয়েছি: এস


4
কৌতূহলী, কেন পরীক্ষাগুলি এক সাথে একটি ফাইলে যোগদান করা দরকার?
thgaskell

4
স্থানীয় ভেরিয়েবল এবং সংস্থার ভাগ করে নেওয়ার জন্য
coiso

আপনি যদি পরীক্ষাগুলিকে প্রশ্নের মধ্যে অন্তর্ভুক্ত করেন তবে এটি আরও অর্থবোধ করতে পারে। দেখে মনে হচ্ছে আপনি ইন্টিগ্রেশন পরীক্ষার দিকে ঝুঁকছেন (ইউনিট পরীক্ষার বিপরীতে)। সাধারণত আপনাকে পরীক্ষাগুলিতে ভেরিয়েবলগুলি ভাগ করে নেওয়া উচিত নয়।
থাগসেকেল

4
এবং বড় সমস্যাটি হ'ল আমি পছন্দ করবো যে 1 টি
হুউউজ

4
এছাড়াও, আপনি যদি বিবেচনা করেন যে মোচা কীভাবে স্যুটটিকে ধারণার সাথে পরিচালনা করে .only()তা describe.only()পরীক্ষার পুরো ডিরেক্টরিটি চালাতে সক্ষম হতে কার্যকর হতে পারে । এটাই আমাকে এখানে এনেছে।
ক্রিস

উত্তর:


114

আপনি একাধিক মডিউল অন্তর্ভুক্ত করতে চাইলে মধ্যে আপনার describeঅনুক্রমের যে আপনি আপনার প্রশ্নে করছ, কি করছ প্রায় কাছাকাছি হয় এটা যদি না আপনি একজাতীয় উৎকৃষ্ট কফি জন্য একটি কাস্টম পরীক্ষা লোডার লিখতে চান। কাস্টম লোডারটি লেখা আপনার পক্ষে ইতিমধ্যে যা আছে তার চেয়ে আপনার কোডটি আরও পরিষ্কার করা বা আপনার কোডটি পরিষ্কার করা সহজ হবে না।

আমি কীভাবে কয়েকটি জিনিস পরিবর্তন করব তার উদাহরণ এখানে। testএই উদাহরণে সাব সংগঠিত হয়:

.
└── test
    ├── a
    │   └── a.js
    ├── b
    │   └── b.js
    ├── common.js
    └── top.js

top.js:

function importTest(name, path) {
    describe(name, function () {
        require(path);
    });
}

var common = require("./common");

describe("top", function () {
    beforeEach(function () {
       console.log("running something before each test");
    });
    importTest("a", './a/a');
    importTest("b", './b/b');
    after(function () {
        console.log("after all tests");
    });
});

importTestফাংশন শুধু প্রদর্শনী কিভাবে এটি সমগ্র আবার টাইপ করেও একাধিক মডিউল আমদানি পুনরাবৃত্তি হ্যান্ডেল আনা সম্ভব হবে হয় describe(... require...জিনিস প্রতি একক সময়। commonমডিউল রাখা কি পরীক্ষা স্যুট একাধিক মডিউল ব্যবহার করতে হবে বোঝানো হয়। আমি আসলে এটি ব্যবহার করছি না topতবে প্রয়োজনে এটি ব্যবহার করা যেতে পারে।

আমি এখানে লক্ষ্য করুন করবে beforeEachপ্রতিটি একক সাথে নিবন্ধিত পরীক্ষার আগে এটির কোড চালানো হবে itকিনা তারা ভিতরে প্রদর্শিত describeমধ্যে topঅথবা তারা প্রদর্শিত আমদানিকৃত মডিউল কোন । এর সাথে --recursive, beforeEachকোডটি প্রতিটি মডিউলে অনুলিপি করতে হবে বা আপনার beforeEachপ্রতিটি মডিউলে একটি হুক রয়েছে যা সাধারণ মডিউল থেকে আমদানি করা কোনও ফাংশন বলে।

এছাড়াও, afterহুক স্যুটটিতে সমস্ত পরীক্ষার পরে চলবে । এটি দিয়ে প্রতিলিপি করা যাবে না --recursive। যদি আপনি প্রতিটি মডিউলে --recursiveকোডটি ব্যবহার করেন এবং যোগ করেন afterতবে পুরো পরীক্ষার জন্য একবারের পরিবর্তে এটি মডিউল প্রতি একবার কার্যকর করা হবে ।

সমস্ত পরীক্ষাগুলি একটি একক topশিরোনামে প্রদর্শিত হচ্ছে ব্যবহার করে প্রতিলিপি করা যাবে না --recursive। সঙ্গে --recursiveপ্রতিটি ফাইল থাকতে পারে describe("top"কিন্তু এই একটি নতুন তৈরি করবে topপ্রতিটি ফাইলের জন্য শিরোনাম নেই।

common.js:

var chai = require("chai");

var options = {
    foo: "foo"
};

exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;

এরকম নামযুক্ত মডিউলটি ব্যবহার করা commonএমন কিছু যা আমি আমার পরীক্ষার স্যুটগুলিতে কিছু করেছি যাতে requireএকগুচ্ছ পদার্থের ঝাঁক না পড়ে এবং বিশ্বব্যাপী পঠনযোগ্য কেবল পরিবর্তনশীল বা ফাংশন থাকে যা রাষ্ট্র রাখে না। আমি globalথাগসেকেলের উত্তরের মতো এই জিনিসটিকে দূষিত না করা পছন্দ করি কারণ এই কোডটি সত্যই বিশ্বব্যাপী এবং তৃতীয় পক্ষের লাইব্রেরিতে এমনকি আপনার কোডটি লোড হচ্ছে access এটি আমার কোডটিতে আমি গ্রহণযোগ্য বলে মনে করি না।

a/a.js:

var common = require("../common");
var options = common.options;
var assert = common.assert;

it("blah a", function () {
    console.log(options.foo);
    assert.isTrue(false);
});

b/b.js:

it("blah b", function () {});

4
যদিও আমি সম্মত হই যে আপনার globalসুযোগ কলুষিত করা উচিত নয় , আমি পরীক্ষার ফাইলগুলি পরিষ্কার রাখার জন্য দৃ the় লাইব্রেরিগুলির জন্য এটি ব্যবহার করি। আপনি ওভাররাইট করছেন এমনটি নয় global.processglobalঅন্যান্য লাইব্রেরিগুলি সুস্পষ্টভাবে কল না করা সম্ভব না হলে স্থানীয় ভেরিয়েবলগুলি ওভাররাইড হবে global.XYZ। এটি কেবল পরীক্ষার সময়কালের জন্য স্থায়ী হয়। আমাকে এখনও আঘাত করেনি, তবে আমি আপনাকে এই মুহুর্তে জানাব যে এটি আমাকে
পাছায় কামড়েছে

উদাহরণস্বরূপ importTestবলা এবং কল করার মধ্যে পার্থক্য কী require('path')()?
চেরিনার্ড

@ ক্রিসলদেভ importTestফাংশনটি কেবল একটি সুবিধাজনক ফাংশন। এটি গুরুত্বপূর্ণ কাজটি হল requireএকটি describeব্লকে কলটি মোড়ানো । এটি গুরুত্বপূর্ণ যে requireকলটি মোড়ানো describeহবে অন্যথায় মডিউলগুলি তাদের নিজস্ব ব্লকে আলাদা করা হবে না এবং আমদানি করা ফাইল দ্বারা সেট করা কোনও হুক ভুল ব্লকে সেট করা হবে। যদি কোনও মোড়ক ছাড়াই importTestসরাসরি কল করে প্রতিস্থাপন করা হয় তবে মডিউলগুলি এবং হুকগুলি ভাগ করে নেওয়া হবে। উদাহরণস্বরূপ, একটি হুক সেট প্রতিটি পরীক্ষার আগে চালিত হত । requiredescribea/ab/bbeforeEachb/ba/a
লুই

4
আমি আপনার শীর্ষ স্তরের বর্ণনকারী পূর্বের মতো কোনও যুক্তি চালাব না। প্রতিটি ফাইলের আগে প্রতিটি "স্টাফ" তৈরি করতে দিন। আপনি যদি এটি করেন তবে আপনি একে অপরের সাথে আপনার পরীক্ষাগুলির সংযোগ করছেন এবং সম্পর্কযুক্ত বাস্তবায়ন করবেন না।
PositiveGuy

4
আমদানি টেস্ট ফাংশনে নয়, আমি তাদের নিজ নিজ ফাইলগুলিতে বর্ণনার মোড়কও করব। শীর্ষ স্তরের প্রতিটি নিজ নিজ ফাইলে বর্ণনা যাহাই হউক না কেন তাদের পরীক্ষা সংকলনের উদ্দেশ্য বর্ণনা করা উচিত
PositiveGuy

35

যদিও এটি সরাসরি প্রশ্নের সাথে যুক্ত নাও হতে পারে তবে আমি যে উত্তরটি খুঁজছিলাম তা হ'ল:

$ mocha --recursive

"পরীক্ষা" ফোল্ডারের উপ ডিরেক্টরিতে সমস্ত পরীক্ষা চালানো হবে। ঝরঝরে। আমি যে পরীক্ষাগুলি লোড করতে চাইছি তার তালিকা বজায় রাখা এবং আসলে সবসময় সবসময় চালানো সংরক্ষণ করে।


4
সেরা উত্তর! অন্যান্য প্রস্তাবিত সমাধানগুলির চেয়ে অনেক সহজ।
caiosm1005

12
@ caiosm1005 এই উত্তরটি আসলে ওপি দ্বারা উপস্থাপিত সমস্যার সমাধান করছে না । অবশ্যই, ওপি যা করতে চায় তা করার যদি আপনার প্রয়োজন না হয় তবে আপনার এটি ব্যবহার করা উচিত। তবে, আপনি যদি প্রতিটি পরীক্ষার ফাইলকে একাধিক describeব্লকে, describeব্লক করে যেগুলি ফাইলগুলিকে স্প্যান --recursiveকরতে চায় তবে এটি করবে না। এটি ওপির সমস্যার সমাধান করে না বলেই আমি এটিকে "সেরা" বলব না।
লুই

@ লুইস - আমি বিশ্বাস করি আপনি প্রতিটি পৃথক ফাইলকে describeব্লকগুলিতে গুটিয়ে রাখতে পারবেন
ইয়ান জ্যামিসন

4
@ ইয়ানজামিসন ওপি চেষ্টা করছে একটি একক ব্লক দিয়ে একাধিক ফাইল covered েকে রাখা । প্রশ্ন তাকান। "কন্ট্রোলার" ব্লক পরীক্ষার পরিবেষ্টন করা উচিত এবং । কোনও মোচা আমন্ত্রণের উপর চড় মারার ফলে যাদুতে কোনও ব্লক তৈরি হয় না । describedescribe./controllertests/messages.js./controllertests/users.js--recursivedescribe("Controllers"
লুই

4
@ লুইস কেবল সাহায্য করার চেষ্টা করছেন। আমি যদি ম্যাজিকালি describeব্লক তৈরির চেষ্টা করে আপনাকে বিরক্ত করি - তবে আমি নিজে ডাম্বলডোরের কাছ থেকে শিখেছি।
ইয়ান জ্যামিসন

16

এমন কোনও কিছুই নেই যা আপনাকে একাধিক পরীক্ষার ফাইল চালানো থেকে বাধা দেয়। সাধারণত, প্রতিটি পরীক্ষা অন্য পরীক্ষার ফলাফলের উপর নির্ভরশীল না হওয়া উচিত, সুতরাং ভেরিয়েবলগুলি ভাগ করে নেওয়ার কিছু নয় যা আপনি করতে চান।

আপনি কীভাবে আপনার পরীক্ষার ফাইলগুলি সংগঠিত করতে পারেন তার একটি উদাহরণ এখানে।

.
├── app.js
└── test
    ├── common.js
    ├── mocha.opts
    │
    ├── controllers
    │   ├── messages-controller.js
    │   └── users-controller.js
    │
    └── models
        ├── messages-model.js
        └── users-model.js

তারপরে আপনার mocha.optsফাইলের অভ্যন্তরে, --recursiveবিকল্পটি সেট করা নিশ্চিত করুন ।

mocha.opts

--ui bdd
--recursive

সেখানে যদি হয় সাধারণ মডিউল যা আপনি সব ফাইল জুড়ে অন্তর্ভুক্ত করতে চান, আপনি যে যোগ করতে পারেন common.jsফাইল। testডিরেক্টরিটির মূলের ফাইলগুলি নেস্টেড ডিরেক্টরিগুলিতে ফাইলগুলির আগে চলবে।

সাধারণ.js

global.chai = require('chai');
global.assert = chai.assert;
global.expect = chai.expect;
chai.should();
chai.config.includeStack = true;

process.env.NODE_ENV = 'test';

// Include common modules from your application that will be used among multiple test suites.
global.myModule = require('../app/myModule');

4
কন্ট্রোলার এবং মডেল ডিরেক্টরিতে ফাইলের জন্য কোড যুক্ত করার বিষয়ে কেউ কি মন চায়? এটির পুরো উদাহরণটি পাওয়া ভাল লাগবে।
গাভিন

@ গ্যাভিন - এগুলি কেবল পরীক্ষার স্যুট হবে যাতে এতে তারা থাকেdescribe('mytest', function() { /* ..... etc */ });
ইয়ান জ্যামিসন

8

আমি জানি এটি একটি পুরানো পোস্ট তবে আমি ওপি কর্তৃক প্রস্তাবিত পদ্ধতির সাথে মিলেমিশে আমার কাছে কী ভাল সমাধান হয়েছে তা নিয়ে আমি চিমে থাকতে চেয়েছিলাম।

আমি যে প্রকল্পে কাজ করছি তা ভালভাবে পরীক্ষিত এবং পরীক্ষাগুলি বাড়তে থাকে। আমি ব্যবহারটি শেষ করেছি requireকারণ এটি সিঙ্ক্রোনাস এবং তাই আর্কিটেকচারে খুব বেশি পরিবর্তন ছাড়াই আপনার পরীক্ষাগুলি রচনা করা কিছুটা সহজ করে তোলে:

// inside test/index.js

describe('V1 ROUTES', () => {
  require('./controllers/claims.test');
  require('./controllers/claimDocuments.test');
  require('./controllers/claimPhotos.test');
  require('./controllers/inspections.test');
  require('./controllers/inspectionPhotos.test');
  require('./controllers/versions.test');
  require('./services/login.v1.test');
});

describe('V2 ROUTES', () => {
  require('./services/login.v2.test');
  require('./services/dec-image.v2.test');
});

describe('V3 ROUTES', () => {
  require('./services/login.v3.test');
  require('./services/getInspectionPhotosv3.test');
  require('./services/getPolicyInfo.v3.test');
});

describe('ACTIONS', () => {
  require('./actions/notifications.test');
});

2

আমার একই ধরণের সমস্যা হয়েছিল যেখানে একই বিভাগে ক্লাসগুলির জন্য আমার প্রচুর পরীক্ষাগুলি ছিল এবং আমি তাদের আইডিইতে দেখা আরও সহজ করার জন্য তাদের একসাথে গ্রুপ করতে চেয়েছিলাম। আমার সমস্ত পরীক্ষার এবং কোডগুলি ইতিমধ্যে ES6 মডিউলগুলি ব্যবহার করছিল - আমি requireঅন্যান্য উদাহরণগুলিতে দেখেছি এমনভাবে ব্যবহার করার জন্য আমি তাদের সকলকেই আবার লিখতে চাই না ।

আমার "গোষ্ঠীকরণ" describeরফতানি করে, এবং তারপরে এটি আমার পরীক্ষার ফাইলগুলিতে আমদানি করে এবং প্রোগ্রামগতভাবে সেগুলি আমদানিতে যুক্ত করে সমাধান করেছি describe। প্লাম্বিংয়ের সমস্ত বিমূর্ত করার জন্য আমি একটি সহায়ক পদ্ধতি তৈরি করে শেষ করেছি।

কিছুশ্রেণীর মধ্যে.স্পেক.জেএস

const someCategory= describe("someCategory", () => {});


// Use this just like a regular `describe` to create a child of this scope in another file
export default function describeMember(skillName, testFn) {
  return describe(skillName, function configureContext() {
    // Make context a child of `someCategory` context
    function Context() {}
    Context.prototype = someCategory.ctx;
    this.ctx = new Context();
    // Re-parent the suite created by `describe` above (defaults to root scope of file it was created in)
    this.parent.suites.pop();
    someCategory.addSuite(this);
    // Invoke the fn now that we've properly set up the parent/context
    testFn.call(this);
  });
}

স্বতন্ত্র পরীক্ষায়:

import { default as describeCategoryMember } from './someCategory.spec';

describeCategoryMember('something', () => {
    describe('somethingElse', () => {
        ...
    });

    it('a test', () => {
        ...
    });
})

-11
describe( 'Running automation test, Please wait for all test to complete!'.red, function () {


    var run = require( './Test.js' );

    for ( var i = 0; i < 2; i++ ) {
        run.badLogin();
        run.loginLimited();
        run.acceptJob();
        run.drivingToJob();
        run.arrivedAtJob();
        run.towingJob();
        run.arrivedDestination();
        run.jobComplete();
        run.restrictionLicensePlate();
        run.newNodeMainMenu();
        run.newNodeMainMenuToDrafts();
        run.draftDelete();
        run.resetAllData();
        run.companyVehicle();
        run.actionsScreenClockInOut();
        run.mainMenuLogout();
        run.loginAdmin();
        run.actionsScreenLogout();
    }
} );

4
কোড সহ বিবরণ যুক্ত করা ভাল, যাতে অন্যরা নির্ধারণ করতে পারে যে এটি গ্রহণযোগ্য উত্তর কিনা।
Suever

4
লুপ কেন? কি আছে ./Test.js? কে জানে? রেকর্ডের জন্য, আমি বর্তমানে মোচা ট্যাগের শীর্ষ উত্তরদাতা । আমি মোচাকে ভিতরে এবং বাইরে জানি কিন্তু আমি এই উত্তরটি বুঝতে পারি না।
লুই

@ লুইস মনে হচ্ছে তিনি লুপটি ব্যবহার করে n বার পরীক্ষা চালাতে চেয়েছিলেন ।
আকাশ আগারওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.