ইউনিট টেস্টিং যেমন ফাসার হিসাবে একটি রাষ্ট্রীয় কাঠামো?


9

টিএল; ডিআর একটি রাষ্ট্রীয় কাঠামোর মধ্যে কাজ করার সময় স্বয়ংক্রিয় ইউনিট পরীক্ষা সহজ করার জন্য কৌশলগুলি সনাক্তকরণে আমার সহায়তা প্রয়োজন।


পটভূমি:

আমি বর্তমানে টাইপস্ক্রিপ্ট এবং ফেজার ফ্রেমওয়ার্কে একটি গেম লিখছি । Phaser নিজেকে একটি HTML5 গেম ফ্রেমওয়ার্ক হিসাবে বর্ণনা করে যা আপনার কোডের কাঠামোকে সীমাবদ্ধ করার জন্য যতটা সম্ভব চেষ্টা করে। এটি কয়েকটি ট্রেড অফের সাথে আসে, যেমন একটি thereশ্বর-অবজেক্ট ফ্যাসার রয়েছে ame যা আপনাকে সমস্ত কিছু অ্যাক্সেস করতে দেয়: ক্যাশে, পদার্থবিজ্ঞান, গেমের স্টেটস এবং আরও অনেক কিছু।

এই স্থিতিস্থাপকতা আমার টাইলম্যাপের মতো প্রচুর কার্যকারিতা পরীক্ষা করা সত্যিই শক্ত করে তোলে। আসুন একটি উদাহরণ দেখুন:

এখানে আমি আমার টাইল স্তরগুলি সঠিকভাবে কিনা তা পরীক্ষা করে নিচ্ছি এবং আমি আমার টাইলম্যাপের মধ্যে দেয়াল এবং প্রাণীগুলি সনাক্ত করতে পারি:

export class TilemapTest extends tsUnit.TestClass {
    constructor() {
        super();

        this.map = this.mapLoader.load("maze", this.manifest, this.mazeMapDefinition);

        this.parameterizeUnitTest(this.isWall,
            [
                [{ x: 0, y: 0 }, true],
                [{ x: 1, y: 1 }, false],
                [{ x: 1, y: 0 }, true],
                [{ x: 0, y: 1 }, true],
                [{ x: 2, y: 0 }, false],
                [{ x: 1, y: 3 }, false],
                [{ x: 6, y: 3 }, false]
            ]);

        this.parameterizeUnitTest(this.isCreature,
            [
                [{ x: 0, y: 0 }, false],
                [{ x: 2, y: 0 }, false],
                [{ x: 1, y: 3 }, true],
                [{ x: 4, y: 1 }, false],
                [{ x: 8, y: 1 }, true],
                [{ x: 11, y: 2 }, false],
                [{ x: 6, y: 3 }, false]
            ]);

আমি যাই করি না কেন, আমি মানচিত্রটি তৈরি করার চেষ্টা করার সাথে সাথে, ফ্যাসার অভ্যন্তরীণভাবে এটির ক্যাশেটি আহ্বান করে, যা কেবল রানটাইম চলাকালীন সময়েই জনবহুল।

পুরো গেমটি লোড না করেই আমি এই পরীক্ষার আবেদন করতে পারি না।

একটি জটিল সমাধান হতে পারে এমন কোনও অ্যাডাপ্টার বা প্রক্সি লেখার জন্য যা কেবলমাত্র যখন আমাদের এটি স্ক্রিনে প্রদর্শনের প্রয়োজন তখন মানচিত্র তৈরি করে। অথবা আমি নিজে প্রয়োজন কেবল সম্পদ লোড করে এবং পরে এটি কেবল নির্দিষ্ট পরীক্ষার শ্রেণি বা মডিউলটির জন্য ব্যবহার করে গেমটি নিজেকে জনপ্রিয় করতে পারি ulate

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

এটি দুর্দান্ত, কারণ আমি নিজের সমস্ত কার্যকারিতা যাচাই করতে পারি, তবে এটিও অসাধারণ, কারণ এটি প্রযুক্তিগত একটি ইন্টিগ্রেশন পরীক্ষা এবং আমি কেবল পর্দায় তাকিয়ে দেখতে পারি না এবং শত্রুদের প্রদর্শিত হয় কিনা তা অবাক করে তোলে। আসলে, না, তাদের আইটেম হিসাবে ভুল পরিচয় দেওয়া হতে পারে (আগেই ঘটেছিল) বা - পরে পরীক্ষাগুলিতে- তাদের মৃত্যুর সাথে জড়িত ঘটনাগুলি দেওয়া নাও হতে পারে।

আমার প্রশ্ন - একটি পরীক্ষার রাজ্যে কি চকচকে এই সাধারণ? বিশেষত জাভাস্ক্রিপ্ট পরিবেশে কি আরও ভাল পন্থাগুলি রয়েছে যা আমি অবগত নই?


আরেকটি উদাহরণ:

ঠিক আছে, এখানে কী ঘটছে তা ব্যাখ্যা করার জন্য আরও একটি সুনির্দিষ্ট উদাহরণ:

export class Tilemap extends Phaser.Tilemap {
    // layers is already defined in Phaser.Tilemap, so we use tilemapLayers instead.
    private tilemapLayers: TilemapLayers = {};

    // A TileMap can have any number of layers, but
    // we're only concerned about the existence of two.
    // The collidables layer has the information about where
    // a Player or Enemy can move to, and where he cannot.
    private CollidablesLayer = "Collidables";
    // Triggers are map events, anything from loading
    // an item, enemy, or object, to triggers that are activated
    // when the player moves toward it.
    private TriggersLayer    = "Triggers";

    private items: Array<Phaser.Sprite> = [];
    private creatures: Array<Phaser.Sprite> = [];
    private interactables: Array<ActivatableObject> = [];
    private triggers: Array<Trigger> = [];

    constructor(json: TilemapData) {
        // First
        super(json.game, json.key);

        // Second
        json.tilesets.forEach((tileset) => this.addTilesetImage(tileset.name, tileset.key), this);
        json.tileLayers.forEach((layer) => {
            this.tilemapLayers[layer.name] = this.createLayer(layer.name);
        }, this);

        // Third
        this.identifyTriggers();

        this.tilemapLayers[this.CollidablesLayer].resizeWorld();
        this.setCollisionBetween(1, 2, true, this.CollidablesLayer);
    }

আমি আমার টাইলম্যাপটি তিনটি অংশ থেকে তৈরি করছি:

  • মানচিত্রের key
  • manifestবিশদ সকল সম্পদ (tilesheets এবং spritesheets) মানচিত্রে প্রয়োজনীয়
  • একটি mapDefinitionযা টাইলম্যাপের কাঠামো এবং স্তরগুলি বর্ণনা করে।

প্রথমে, ফেজরের মধ্যে টাইলম্যাপটি তৈরি করতে আমাকে অবশ্যই সুপার কল করতে হবে। এটি সেই অংশ যা এই সমস্ত কলগুলিকে ক্যাশে অনুরোধ করে কারণ এটি কেবলমাত্র সংখ্যায় সংজ্ঞায়িত কীগুলি নয়, প্রকৃত সম্পদগুলি অনুসন্ধান করার চেষ্টা করে manifest

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

তৃতীয়ত, আমি বারবার আমার স্তর দিয়ে কোনো বিশেষ বস্তু খুঁজে যে আমি মানচিত্র থেকে বহিষ্কৃত করতে চাই: Creatures, Items, Interactablesএবং তাই ঘোষণা। আমি এই জিনিসগুলি পরে ব্যবহারের জন্য তৈরি এবং সঞ্চয় করি।

আমার কাছে এখনও একটি অপেক্ষাকৃত সহজ এপিআই রয়েছে যা আমাকে এই সত্তাগুলি সন্ধান, অপসারণ ও আপডেট করতে দেয়:

    wallAt(at: TileCoordinates) {
        var tile = this.getTile(at.x, at.y, this.CollidablesLayer);
        return tile && tile.index != 0;
    }

    itemAt(at: TileCoordinates) {
        return _.find(this.items, (item: Phaser.Sprite) => _.isEqual(this.toTileCoordinates(item), at));
    }

    interactableAt(at: TileCoordinates) {
        return _.find(this.interactables, (object: ActivatableObject) => _.isEqual(this.toTileCoordinates(object), at));
    }

    creatureAt(at: TileCoordinates) {
        return _.find(this.creatures, (creature: Phaser.Sprite) => _.isEqual(this.toTileCoordinates(creature), at));
    }

    triggerAt(at: TileCoordinates) {
        return _.find(this.triggers, (trigger: Trigger) => _.isEqual(this.toTileCoordinates(trigger), at));
    }

    getTrigger(name: string) {
        return _.find(this.triggers, { name: name });
    }

আমি যাচাই করতে চাই এটি এই কার্যকারিতা। আমি যদি টাইল স্তর বা টাইলসেট যুক্ত না করি তবে মানচিত্রটি রেন্ডার করবে না, তবে আমি এটি পরীক্ষা করতে সক্ষম হতে পারি। যাইহোক, এমনকি সুপার (...) কল করা প্রসঙ্গ-নির্দিষ্ট বা রাষ্ট্রীয় যুক্তিটিও আহ্বান করে যা আমি আমার পরীক্ষাগুলিতে বিচ্ছিন্ন করতে পারি না।


2
আমি বিভ্রান্ত আপনি কি পরীক্ষার চেষ্টা করছেন যে ফেজার টাইলম্যাপটি লোড করার কাজটি করছেন বা আপনি নিজেই টাইলম্যাপের বিষয়বস্তু পরীক্ষা করার চেষ্টা করছেন? যদি এটি পূর্ববর্তী হয় তবে আপনি সাধারণত পরীক্ষা করেন না যে আপনার নির্ভরতাগুলি তাদের কাজ করে; এটি গ্রন্থাগারের রক্ষণাবেক্ষণকারীর কাজ। যদি আধুনিক হয় তবে আপনার গেমের যুক্তিটি কাঠামোর সাথে খুব শক্তভাবে মিশ্রিত। পারফরম্যান্স যতটা অনুমতি দেবে, আপনি আপনার গেমের অভ্যন্তরীণ কাজগুলি খাঁটি রাখতে চান এবং এই ধরণের গণ্ডগোল এড়াতে পার্শ্ব প্রতিক্রিয়াগুলি প্রোগ্রামের শীর্ষ স্তরের স্তরে রেখে যেতে চান।
ডোভাল

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

1
আপনি কীভাবে ব্যাখ্যা করতে পারেন যে ফাসার ঠিক তখন এতে জড়িত ছিলেন? ফেজার কোথায় এবং কেন ডাকা হয়েছিল তা আমার কাছে পরিষ্কার নয়। মানচিত্রটি কোথা থেকে আসছে?
ডোভাল

আমি বিভ্রান্তির জন্য দুঃখিত! আমি পরীক্ষার চেষ্টা করছি এমন কার্যকারিতার এককের উদাহরণ হিসাবে আমি আমার টাইলম্যাপ কোড যুক্ত করেছি। টাইলম্যাপটি একটি এক্সটেনশন (বা optionচ্ছিকভাবে হ'ল) ​​ফ্যাসার T টাইলম্যাপ যা আমাকে ব্যবহার করতে চাই তার অতিরিক্ত গুছিয়ে একগুচ্ছ টাইলম্যাপটি রেন্ডার করতে দেয়। সর্বশেষ অনুচ্ছেদে আমি কেন এটি বিচ্ছিন্নভাবে পরীক্ষা করতে পারি না তা হাইলাইট করে। এমনকি কোনও উপাদান হিসাবে, এই মুহুর্তে আমি কেবলমাত্র new Tilemap(...)ফ্যাসার তার ক্যাশে খনন শুরু করি । আমাকে তা স্থগিত করতে হবে, তবে এর অর্থ আমার টাইলম্যাপটি দুটি রাজ্যে রয়েছে যা একটি নিজেকে সঠিকভাবে উপস্থাপন করতে পারে না এবং সম্পূর্ণরূপে নির্মিত।
আইএইই

আমার কাছে মনে হয়, যেমন আমি আমার প্রথম মন্তব্যে বলেছিলাম, আপনার গেমের যুক্তিটি কাঠামোর সাথে মিলিয়েছে। আপনার ফ্রেমটিকে একেবারে ফ্রেম না এনে আপনার গেম যুক্তি চালাতে সক্ষম হওয়া উচিত। টাইল মানচিত্রটিকে স্ক্রিনে আঁকতে ব্যবহৃত সম্পত্তির সাথে মিলিত করার পদ্ধতিটি এখন চলছে।
ডোভাল

উত্তর:


2

ফেজার বা টাইপসিসিপ্ট না জানা, আমি এখনও আপনাকে একটি উত্তর দেওয়ার চেষ্টা করি, কারণ আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল এমন সমস্যাগুলি যা অন্যান্য অনেক কাঠামোর সাথেও দৃশ্যমান। সমস্যাটি হ'ল উপাদানগুলি দৃly়ভাবে একত্রে করা হয় (সমস্ত কিছু Godশ্বরের অবজেক্টের দিকে নির্দেশ করে এবং Godশ্বর বস্তু সব কিছুর মালিক ...)। ফ্রেমওয়ার্কের নির্মাতারা যদি ইউনিট-টেস্টগুলি তৈরি করে তবে এমনটি হওয়ার সম্ভাবনা ছিল না।

মূলত আপনার চারটি বিকল্প রয়েছে:

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

2

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

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

ইউনিট টেস্টিং প্রমাণ করে যে আপনার কোডের ছোট্ট অংশগুলি সঠিক ফলাফল দেয়। ইউনিট পরীক্ষার লক্ষ্যটিতে তৃতীয় পক্ষের কোড টেস্টিং অন্তর্ভুক্ত নয়। অনুমানটি হ'ল কোডটি তৃতীয় পক্ষের দ্বারা প্রত্যাশা অনুযায়ী কাজ করার জন্য ইতিমধ্যে পরীক্ষিত। কোডের জন্য একটি ইউনিট টেস্ট লেখার সময় যা কোনও কাঠামোর উপর নির্ভর করে, কোডে একটি নির্দিষ্ট রাজ্যের মতো দেখতে কী প্রস্তুত তা নির্ধারণ করতে বা ফ্রেমওয়ার্ক / লাইব্রেরি পুরোপুরি শিম করার জন্য কিছু নির্ভরতা শিম করা সাধারণ। একটি সাধারণ উদাহরণ কোনও ওয়েবসাইটের সেশন ম্যানেজমেন্ট: সম্ভবত শিম স্টোরেজ থেকে পড়ার পরিবর্তে সর্বদা বৈধ, সামঞ্জস্যপূর্ণ অবস্থায় ফিরে আসে। আর একটি সাধারণ উদাহরণ মেমরিতে ঝিমঝিম করা এবং কোনও লাইব্রেরিকে বাইপাস করা যা কোনও ডেটাবেসকে জিজ্ঞাসা করে, কারণ আপনি যে ডাটাবেসটি বা লাইব্রেরিটি এটিতে সংযোগ করতে ব্যবহার করছেন তা পরীক্ষা করার লক্ষ্য নয়, কেবল আপনার কোডটি সঠিকভাবে প্রক্রিয়া করে।

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

সুতরাং আমি মনে করি আপনি ইউনিট পরীক্ষার মাধ্যমে সঠিক পথে রয়েছেন। পুরো সিস্টেমটির কার্যকরী টেস্টিং যুক্ত করার জন্য আমি পৃথক পরীক্ষা তৈরি করব যা ফাসার রানটাইম শুরু করবে এবং ফলাফলগুলি পরীক্ষা করবে।

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