ইউনিট পরীক্ষা, ইউনিট পরীক্ষা, ইউনিট পরীক্ষা, ইউনিট পরীক্ষা

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

ইউনিট পরীক্ষার দুটি সেট রয়েছে: জেএস পরীক্ষা এবং ব্লক জেনারেটর পরীক্ষা।

জেএস টেস্ট

JS পরীক্ষাগুলি ব্লকলির কোরে অভ্যন্তরীণ জাভাস্ক্রিপ্ট ফাংশনগুলির অপারেশন নিশ্চিত করে৷ আমরা ইউনিট পরীক্ষা চালানোর জন্য Mocha ব্যবহার করি, স্টাব নির্ভরতার জন্য Sinon এবং কোড সম্পর্কে দাবি করার জন্য Chai ব্যবহার করি।

চলমান টেস্ট

ব্লকলি এবং ব্লকলি উভয় নমুনায়, npm run test ইউনিট পরীক্ষা চালাবে। ব্লকলি, এটি লিন্টিং এবং কম্পাইলেশনের মতো অন্যান্য পরীক্ষাও চালাবে। আপনি একটি ব্রাউজারে tests/mocha/index.html খুলতে পারেন যাতে ইন্টারেক্টিভভাবে সমস্ত মোচা পরীক্ষা চালানো যায়।

লেখার পরীক্ষা

আমরা পরীক্ষা চালানোর জন্য Mocha TDD ইন্টারফেস ব্যবহার করি। পরীক্ষাগুলি স্যুটগুলিতে সংগঠিত হয়, যাতে অতিরিক্ত সাব-স্যুট এবং/অথবা পরীক্ষা উভয়ই থাকতে পারে। সাধারণত, ব্লকলির প্রতিটি উপাদানের (যেমন toolbox বা workspace ) এর নিজস্ব পরীক্ষা ফাইল থাকে যাতে এক বা একাধিক স্যুট থাকে। প্রতিটি স্যুটে একটি setup এবং teardown পদ্ধতি থাকতে পারে যা সেই স্যুটের প্রতিটি পরীক্ষার আগে এবং পরে যথাক্রমে বলা হবে।

পরীক্ষা সহায়ক

আমাদের কাছে ব্লকলির জন্য নির্দিষ্ট কিছু সহায়ক ফাংশন রয়েছে যা পরীক্ষা লেখার সময় উপযোগী হতে পারে। এগুলি মূল এবং ব্লকলি-নমুনাগুলিতে পাওয়া যেতে পারে।

সহায়ক ফাংশনগুলির মধ্যে রয়েছে sharedTestSetup এবং sharedTestTeardown যা আপনার পরীক্ষার আগে এবং পরে কল করা প্রয়োজন (প্রয়োজনীয়তা বিভাগ দেখুন)।

sharedTestSetup :
  • sinon জাল টাইমার সেট আপ করে (কিছু পরীক্ষায় আপনাকে this.clock.runAll ব্যবহার করতে হবে)।
  • অবিলম্বে ফায়ার করার জন্য Stubs.Events.fire (কনফিগারযোগ্য)।
  • সংজ্ঞায়িত ব্লক টাইপগুলির স্বয়ংক্রিয় ক্লিনআপ সেট আপ করে যদিও defineBlocksWithJsonArray .
  • this প্রসঙ্গে কয়েকটি বৈশিষ্ট্য ঘোষণা করে যা অ্যাক্সেসযোগ্য হতে বোঝানো হয়েছে:
    • this.clock (কিন্তু পুনরুদ্ধার করা উচিত নয় অন্যথায় এটি sharedTestTeardown এ সমস্যা সৃষ্টি করবে)
    • this.eventsFireStub
    • this.sharedCleanup ( addMessageToCleanup এবং addBlockTypeToCleanup এর সাথে ব্যবহার করা হবে) (দ্রষ্টব্য: আপনি যদি defineBlocksWithJsonArray ব্যবহার করে ব্লকটি সংজ্ঞায়িত করেন তবে আপনাকে addBlockTypeToCleanup ব্যবহার করার দরকার নেই)

সেটআপ কনফিগার করার জন্য ফাংশনের একটি ঐচ্ছিক options পরামিতি রয়েছে। বর্তমানে, এটি শুধুমাত্র Blockly.Events.fire অবিলম্বে ফায়ার করতে স্টাব করতে হবে কিনা তা নির্ধারণ করতে ব্যবহৃত হয় (ডিফল্টরূপে স্টাব হবে)।

sharedTestTeardown :
  • ওয়ার্কস্পেস this.workspace এর নিষ্পত্তি (এটি কোথায় সংজ্ঞায়িত করা হয়েছে তার উপর নির্ভর করে, আরও তথ্যের জন্য পরীক্ষা প্রয়োজনীয়তা বিভাগ দেখুন)।
  • সমস্ত স্টাব পুনরুদ্ধার করে।
  • defineBlocksWithJsonArray এবং addBlockTypeToCleanup যদিও যোগ করা সমস্ত ব্লকের ধরন পরিষ্কার করে।
  • addMessageToCleanup যদিও যোগ করা সমস্ত বার্তা পরিষ্কার করে।

পরীক্ষার প্রয়োজনীয়তা

  • প্রতিটি পরীক্ষায় sharedTestSetup.call(this); বাইরেরতম স্যুট এবং sharedTestTeardown.call(this); একটি ফাইলের জন্য সবচেয়ে বাইরের স্যুটের টিয়ারডাউনের শেষ লাইন হিসাবে।
  • আপনার যদি জেনেরিক টুলবক্স সহ একটি ওয়ার্কস্পেসের প্রয়োজন হয়, তাহলে আপনি index.html টেস্টে প্রিসেট টুলবক্সগুলির একটি ব্যবহার করতে পারেন। একটি উদাহরণের জন্য নীচে দেখুন.
  • আপনি সঠিকভাবে this.workspace নিষ্পত্তি করতে হবে. বেশিরভাগ পরীক্ষায়, আপনি বাইরের স্যুটে this.workspace সংজ্ঞায়িত করবেন এবং পরবর্তী সমস্ত পরীক্ষার জন্য এটি ব্যবহার করবেন, তবে কিছু ক্ষেত্রে আপনি এটিকে একটি অভ্যন্তরীণ স্যুটে সংজ্ঞায়িত বা পুনরায় সংজ্ঞায়িত করতে পারেন (উদাহরণস্বরূপ, আপনার পরীক্ষার একটির জন্য বিভিন্ন বিকল্পের সাথে একটি ওয়ার্কস্পেস প্রয়োজন। আপনি মূলত সেট আপ করার চেয়ে)। এটা পরীক্ষা শেষে নিষ্পত্তি করা আবশ্যক.
    • আপনি যদি সবচেয়ে বাইরের স্যুটে this.workspace সংজ্ঞায়িত করেন এবং এটিকে পুনরায় সংজ্ঞায়িত না করেন তবে আর কোন পদক্ষেপের প্রয়োজন নেই। sharedTestTeardown দ্বারা এটি স্বয়ংক্রিয়ভাবে নিষ্পত্তি করা হবে।
    • আপনি যদি this.workspace প্রথমবারের মতো একটি অভ্যন্তরীণ স্যুটে সংজ্ঞায়িত করেন (অর্থাৎ আপনি এটিকে বাইরের স্যুটে সংজ্ঞায়িত করেননি), তাহলে আপনাকে অবশ্যই এটির টিয়ারডাউনে workspaceTeardown.call(this, this.workspace) কল করে এটি নিষ্পত্তি করতে হবে স্যুট
    • আপনি যদি outermost স্যুটে this.workpace সংজ্ঞায়িত করেন, কিন্তু তারপর একটি ভিতরের টেস্ট স্যুটে এটিকে পুনরায় সংজ্ঞায়িত করেন, তাহলে আপনাকে অবশ্যই প্রথমে workspaceTeardown.call(this, this.workspace) কল করতে হবে যাতে শীর্ষ স্তরের স্যুটে সংজ্ঞায়িত মূল ওয়ার্কস্পেসটি ছিঁড়ে ফেলার জন্য এটিকে পুনরায় সংজ্ঞায়িত করতে হবে। . এই অভ্যন্তরীণ স্যুট টিয়ারডাউনে আপনাকে আবার workspaceTeardown.call(this, this.workspace) কল করে নতুন মানটি ম্যানুয়ালি নিষ্পত্তি করতে হবে।

টেস্ট স্ট্রাকচার

ইউনিট পরীক্ষাগুলি সাধারণত একটি সেট কাঠামো অনুসরণ করে, যাকে সাজানো, কাজ, জাহির হিসাবে সংক্ষিপ্ত করা যেতে পারে।

  1. ব্যবস্থা করুন : বিশ্বের অবস্থা এবং পরীক্ষার অধীনে আচরণের জন্য প্রয়োজনীয় শর্ত সেট আপ করুন।
  2. আইন : পরীক্ষা করা আচরণকে ট্রিগার করতে পরীক্ষার অধীনে কোডটি কল করুন।
  3. দাবী করুন : সঠিকতা যাচাই করার জন্য রিটার্ন মান বা উপহাস করা বস্তুর সাথে মিথস্ক্রিয়া সম্পর্কে দাবি করুন।

একটি সাধারণ পরীক্ষায়, ব্যবস্থা করার মতো কোনো আচরণ নাও থাকতে পারে, এবং দাবীতে পরীক্ষার অধীনে কোডে কল ইনলাইন করে কাজ এবং দাবী পর্যায়গুলিকে একত্রিত করা যেতে পারে। আরও জটিল ক্ষেত্রে, আপনি যদি এই 3টি ধাপে লেগে থাকেন তাহলে আপনার পরীক্ষাগুলি আরও পঠনযোগ্য হবে।

এখানে একটি উদাহরণ পরীক্ষা ফাইল (আসল জিনিস থেকে সরলীকৃত)।

suite('Flyout', function() {
  setup(function() {
    sharedTestSetup.call(this);
    this.toolboxXml = document.getElementById('toolbox-simple');
    this.workspace = Blockly.inject('blocklyDiv',
        {
          toolbox: this.toolboxXml
        });
  });

  teardown(function() {
    sharedTestTeardown.call(this);
  });

  suite('simple flyout', function() {
    setup(function() {
      this.flyout = this.workspace.getFlyout();
    });
    test('y is always 0', function() {
      // Act and assert stages combined for simple test case
      chai.assert.equal(this.flyout.getY(), 0, 'y coordinate in vertical flyout is 0');
    });
    test('x is right of workspace if flyout at right', function() {
      // Arrange
      sinon.stub(this.flyout.targetWorkspace, 'getMetrics').returns({
        viewWidth: 100,
      });
      this.flyout.targetWorkspace.toolboxPosition = Blockly.TOOLBOX_AT_RIGHT;
      this.flyout.toolboxPosition_ = Blockly.TOOLBOX_AT_RIGHT;

      // Act
      var x = this.flyout.getX();

      // Assert
      chai.assert.equal(x, 100, 'x is right of workspace');
    });
  });
});

এই উদাহরণ থেকে লক্ষ্য করার বিষয়গুলি:

  • একটি স্যুটে অন্যান্য স্যুট থাকতে পারে যেগুলির অতিরিক্ত setup এবং teardown পদ্ধতি রয়েছে৷
  • প্রতিটি স্যুট এবং পরীক্ষার একটি বর্ণনামূলক নাম আছে।
  • কোড সম্পর্কে দাবি করার জন্য চাই দাবিগুলি ব্যবহার করা হয়।
    • আপনি একটি ঐচ্ছিক স্ট্রিং আর্গুমেন্ট সরবরাহ করতে পারেন যা পরীক্ষা ব্যর্থ হলে প্রদর্শিত হবে। এটি ভাঙা পরীক্ষাগুলি ডিবাগ করা সহজ করে তোলে।
    • প্যারামিটারের ক্রম হল chai.assert.equal(actualValue, expectedValue, optionalMessage) । আপনি যদি actual এবং expected অদলবদল করেন তবে ত্রুটি বার্তাগুলি অর্থপূর্ণ হবে না।
  • আপনি যখন আসল কোড কল করতে চান না তখন স্টাব পদ্ধতিতে Sinon ব্যবহার করা হয়। এই উদাহরণে, আমরা আসল মেট্রিক্স ফাংশনকে কল করতে চাই না কারণ এটি এই পরীক্ষার সাথে প্রাসঙ্গিক নয়। আমরা শুধুমাত্র পরীক্ষার অধীনে পদ্ধতি দ্বারা ফলাফল কিভাবে ব্যবহার করা হয় চিন্তা. Sinon একটি ক্যানড প্রতিক্রিয়া ফেরাতে getMetrics ফাংশন স্টাব করে যা আমরা আমাদের পরীক্ষার দাবিতে সহজেই পরীক্ষা করতে পারি।
  • প্রতিটি স্যুটের setup পদ্ধতিতে শুধুমাত্র জেনেরিক সেটআপ থাকা উচিত যা সমস্ত পরীক্ষার জন্য প্রযোজ্য। যদি একটি নির্দিষ্ট আচরণের জন্য একটি পরীক্ষা একটি নির্দিষ্ট শর্তের উপর নির্ভর করে, সেই শর্তটি প্রাসঙ্গিক পরীক্ষায় স্পষ্টভাবে বলা উচিত।

ডিবাগিং পরীক্ষা

  • আপনি একটি ব্রাউজারে পরীক্ষাগুলি খুলতে পারেন এবং ব্রেকপয়েন্ট সেট করতে এবং আপনার পরীক্ষাগুলি অপ্রত্যাশিতভাবে ব্যর্থ হয় কিনা (বা অপ্রত্যাশিতভাবে পাস!) তদন্ত করতে বিকাশকারী সরঞ্জামগুলি ব্যবহার করতে পারেন।
  • শুধুমাত্র পরীক্ষার সেট চালানোর জন্য একটি পরীক্ষা বা স্যুটে .only() বা .skip() সেট করুন, অথবা একটি পরীক্ষা এড়িয়ে যান। যেমন:

    suite.only('Workspace', function () {
      suite('updateToolbox', function () {
        test('test name', function () {
          // ...
        });
        test.skip('test I don’t care about', function () {
          // ...
        });
      });
    });
    

    আপনার কোড কমিট করার আগে এইগুলি সরাতে মনে রাখবেন।

ব্লক জেনারেটর পরীক্ষা

প্রতিটি ব্লকের নিজস্ব ইউনিট পরীক্ষা আছে। এই পরীক্ষাগুলি যাচাই করে যে ব্লকগুলি উদ্দেশ্য অনুযায়ী ফাংশনের চেয়ে কোড তৈরি করে।

  1. ফায়ারফক্স বা সাফারিতে tests/generators/index.html লোড করুন। মনে রাখবেন যে Chrome এবং Opera-এর নিরাপত্তা সীমাবদ্ধতা রয়েছে যা স্থানীয় "file://" সিস্টেম থেকে পরীক্ষাগুলি লোড করতে বাধা দেয় (ইস্যু 41024 এবং 47416 )।
  2. ড্রপ-ডাউন মেনু থেকে পরীক্ষা করার জন্য সিস্টেমের প্রাসঙ্গিক অংশটি বেছে নিন এবং "লোড" এ ক্লিক করুন। ব্লকগুলি কর্মক্ষেত্রে উপস্থিত হওয়া উচিত।
  3. "জাভাস্ক্রিপ্ট" এ ক্লিক করুন।
    একটি জাভাস্ক্রিপ্ট কনসোলে জেনারেট করা কোডটি অনুলিপি করুন এবং চালান। যদি আউটপুট "ঠিক আছে" দিয়ে শেষ হয়, পরীক্ষাটি পাস হয়েছে।
  4. "পাইথন" এ ক্লিক করুন।
    একটি পাইথন ইন্টারপ্রেটারে জেনারেট করা কোডটি অনুলিপি করুন এবং চালান। যদি আউটপুট "ঠিক আছে" দিয়ে শেষ হয়, পরীক্ষাটি পাস হয়েছে।
  5. "PHP" এ ক্লিক করুন।
    একটি পিএইচপি ইন্টারপ্রেটারে জেনারেট করা কোডটি অনুলিপি করুন এবং চালান। যদি আউটপুট "ঠিক আছে" দিয়ে শেষ হয়, পরীক্ষাটি পাস হয়েছে।
  6. "Lua" এ ক্লিক করুন।
    একটি Lua ইন্টারপ্রেটারে জেনারেট করা কোডটি অনুলিপি করুন এবং চালান। যদি আউটপুট "ঠিক আছে" দিয়ে শেষ হয়, পরীক্ষাটি পাস হয়েছে।
  7. "Dart" এ ক্লিক করুন।
    একটি ডার্ট ইন্টারপ্রেটারে জেনারেট করা কোডটি অনুলিপি করুন এবং চালান। যদি আউটপুট "ঠিক আছে" দিয়ে শেষ হয়, পরীক্ষাটি পাস হয়েছে।

ব্লক জেনারেটর পরীক্ষা সম্পাদনা

  1. একটি ব্রাউজারে tests/generators/index.html লোড করুন।
  2. ড্রপ-ডাউন মেনু থেকে সিস্টেমের প্রাসঙ্গিক অংশ বেছে নিন এবং "লোড" এ ক্লিক করুন। ব্লকগুলি কর্মক্ষেত্রে উপস্থিত হওয়া উচিত।
  3. ব্লকে কোনো পরিবর্তন বা সংযোজন করুন।
  4. "XML" এ ক্লিক করুন।
  5. tests/generators/ -এ উপযুক্ত ফাইলে জেনারেট করা XML অনুলিপি করুন।