টিডিডি এবং রিফ্যাক্টরিংয়ের অসুবিধা (বা - এটির চেয়ে বেশি বেদনাদায়ক কেন হওয়া উচিত?)


20

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

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

প্রথমে আমি আমার প্রথম বৈশিষ্ট্যটি কী করতে চেয়েছিলাম তা রূপরেখার জন্য একটি মৌলিক সরল শব্দ গ্রহণযোগ্যতা পরীক্ষা দিয়ে শুরু করেছি। এটি দেখতে এমন কিছু দেখাচ্ছে (ব্রেভিটির জন্য এটি নিস্তেজ করে):

  1. ব্যবহারকারী ক্লিকগুলি প্রকল্প তৈরি করে
  2. প্রকল্পের শিরোনামে ব্যবহারকারী প্রকারগুলি
  3. প্রকল্পটি সঠিকভাবে তৈরি হয়েছে তা যাচাই করুন

ইউআই স্টাফ এবং কিছু মধ্যস্থতাকারী পরিকল্পনা বাদ দিয়ে আমি আমার প্রথম ইউনিট পরীক্ষায় আসি:

[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
    var testController = new Controller();
    Project newProject = testController(A.Dummy<String>());
    Assert.IsNotNull(newProject);
}

এ পর্যন্ত সব ঠিকই. লাল, সবুজ, রিফ্যাক্টর ইত্যাদি ঠিক আছে এখন এটি আসলে সংরক্ষণের জিনিসগুলির প্রয়োজন। কিছু পদক্ষেপ এখানে কাটছি আমি এটি দিয়ে শেষ।

[TestMethod]
public void CreateProject_BasicParameters_ProjectMatchesExpected()
{
    var fakeDataStore = A.Fake<IDataStore>();
    var testController = new Controller(fakeDataStore);
    String expectedTitle = fixture.Create<String>("Title");
    Project newProject = testController(expectedTitle);

    Assert.AreEqual(expectedTitle, newProject.Title);
}

আমি এখনও এই মুহুর্তে ভাল বোধ করছি। আমার কাছে এখনও কোনও কংক্রিটের ডেটা স্টোর নেই, তবে আমি ইন্টারফেসটি তৈরি করেছিলাম যা আমি অনুমান করেছিলাম এটি কেমন হবে।

আমি এখানে কয়েকটি পদক্ষেপ এড়াতে যাচ্ছি কারণ এই পোস্টটি যথেষ্ট দীর্ঘ পাচ্ছে, তবে আমি অনুরূপ প্রক্রিয়াগুলি অনুসরণ করেছি এবং শেষ পর্যন্ত আমি আমার ডেটা স্টোরের জন্য এই পরীক্ষায় পৌঁছাচ্ছি:

[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
    /* snip init code */
    testDataStore.SaveNewProject(A.Dummy<IProject>());
    A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}

আমি এটি প্রয়োগের চেষ্টা না করা পর্যন্ত এটি ভাল ছিল:

public String SaveNewProject(IProject project)
{
    Page projectPage = oneNoteInterop.CreatePage(...);
}

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

কেউ যদি আমাকে এই প্রক্রিয়াতে কিছু ভুল করে থাকে তবে দয়া করে আমাকে ব্যাখ্যা করতে পারেন? যাইহোক এই ধরণের রিফ্যাক্টরিং এড়ানো যায়? নাকি এটা সাধারণ? যদি এটি সাধারণ হয় তবে এটিকে আরও বেদাহীন করার কোনও উপায় আছে কি?

সবাইকে ধন্যবাদ!


আপনি যদি এই আলোচনার ফোরামে এই বিষয়গুলি পোস্ট করে থাকেন তবে আপনি কিছু খুব অন্তর্দৃষ্টিপূর্ণ মন্তব্য পেয়ে যাবেন : গোষ্ঠীগুলি google.com/forum/#!forum/… যা বিশেষত টিডিডি বিষয়গুলির জন্য।
চক ক্রুটসিংগার

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

উত্তর:


19

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

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

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

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


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

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

@ লন্ডন আইমা "বিশ্বাসী ক্লাসিক", সুতরাং আমি ইন্টারঅেশন ভিত্তিক পরীক্ষার সাথে খুব বেশি অভিজ্ঞ নই ... তবে আপনার "মুস্তাভেভবিনক্ল্যাড" এর পক্ষে একটি দৃ as় বক্তব্য রাখার দরকার নেই। আপনি যদি কোনও সন্নিবেশ পরীক্ষা করে নিচ্ছেন তবে এটি সন্নিবেশ করা হয়েছে কিনা তা দেখতে আপনি কোনও ক্যোয়ারী ব্যবহার করতে পারেন। পিএস: ডেটাবেস স্তর ছাড়াও সমস্ত কিছুর টেস্টিংয়ের সময় আমি পারফরম্যান্স বিবেচনার কারণে স্টাব ব্যবহার করি।
Hbas

@ জাজলেট এই সিদ্ধান্তে পৌঁছেছে যে আমিও এসেছি। ধন্যবাদ!
ল্যান্ডন

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

10

... আমি সাহায্য করতে পারছি না তবে অনুভব করতে পারছি যদি টিডিডি প্রক্রিয়া চলাকালীন ডিজাইনের নকশা না করে সময়ের আগে যদি আমি নকশাটি স্কেচ করেছিলাম তবে আমি এই দ্রুতটি ধরতে পারতাম ...

হয়তো, হয়তো না

একদিকে, টিডিডি ঠিকঠাক কাজ করেছে, কার্যকারিতা তৈরি করার সাথে সাথে আপনাকে স্বয়ংক্রিয় পরীক্ষাগুলি দিয়েছিল এবং ইন্টারফেসটি বদলাতে হবে তখনই ততক্ষণে বিরতি।

অন্যদিকে, সম্ভবত আপনি যদি নিম্ন-স্তরের বৈশিষ্ট্য (ক্রিয়েটপ্রজেক্ট) এর পরিবর্তে উচ্চ-স্তরের বৈশিষ্ট্য (সেভপ্রজেক্ট) দিয়ে শুরু করে থাকেন তবে আপনি খুব শীঘ্রই অনুপস্থিত পরামিতিগুলি লক্ষ্য করতে পারতেন।

তারপর আবার, সম্ভবত আপনি না। এটি একটি অপূরণীয় পরীক্ষা

তবে আপনি যদি পরবর্তী সময়ের জন্য পাঠ খুঁজছেন: শীর্ষে শুরু করুন। এবং নকশাটি আপনি যতটা চান আগে চিন্তা করুন।


0

https://frontendmasters.com/courses/angularjs-and-code-testability/ প্রায় 2:22:00 থেকে শেষ পর্যন্ত (প্রায় 1 ঘন্টা)। দুঃখিত যে ভিডিওটি নিখরচায় নয় তবে আমি এমন একটি নিখরচায়ু পাইনি যা এটিকে এত ভালভাবে ব্যাখ্যা করে।

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

ম্যাজিক কোড টেস্ট লেখার চেয়ে টেস্টেবল কোড লেখার ক্ষেত্রে। এটি কোনও কোড লেখার বিষয়ে নয় যা ব্যবহারকারী হিসাবে ভান করে।

পরীক্ষা-নিরীক্ষার আকারে তিনি কিছুটা সময় লেখেন।

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