পরীক্ষা চালিত বিকাশ: ফাইল সিস্টেমের ক্রিয়াকলাপ পরীক্ষা করার একটি ভাল / গ্রহণযোগ্য উপায়?


14

আমি এই মুহুর্তে এমন একটি প্রকল্পে কাজ করছি যা কোনও ফাইল-সিস্টেমের বিষয়বস্তুর উপর ভিত্তি করে একটি সারণী তৈরি করে (অন্যান্য জিনিসের মধ্যে) তৈরি করে এবং ফলস্বরূপ এটি সন্ধান করে এমন কিছু মেটা-ডেটা পরিবর্তন করে ifications প্রশ্নটি হল: পরীক্ষাগুলি কীভাবে এই চারপাশে লেখা উচিত, বা সেট আপ করা উচিত? এটি উপহাস করার কোন সহজ উপায় আছে? নাকি আমার একটি "স্যান্ডবক্স" সেটআপ করা উচিত?

উত্তর:


13

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


টিডিডি পরীক্ষার অধীনে ইউনিটটির প্রয়োগকে উপহাস করার পরামর্শ দেয় না। দেখুন (ঙ, ছ) solnic.eu/2014/05/22/mocking-and-ruby.html
Sõru

1
@ সুরু: এই উত্তরটি যা প্রস্তাব দেয় তা নয়। এটি প্রথমে ইন্টারফেস তৈরি করার পরামর্শ দেয়, তারপরে ইন্টারফেসটিকে উপহাস করে । সুতরাং আপনি ব্যবসায়ের যুক্তি পরীক্ষা করেন তবে ফাইল সিস্টেম ইন্টারফেসটি নয়।
sleske

5
তবে এটি মনে হচ্ছে যে ব্যবসায়ের যুক্তি ফাইল এবং ডিরেক্টরিগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়েছে। সুতরাং ফাইল সিস্টেম এপিআই বলে যে স্টাফটি সেই স্টাফ যা পরীক্ষার প্রয়োজন। সম্পর্কিত কোনও নন-ফাইল বিজনেস লজিক পরীক্ষা করার জন্য মশকরা লাগবে না; শুধু এটি পরীক্ষা।
soru

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

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

11

"পরীক্ষা" ফাইল সিস্টেম থাকাতে কী ভুল?

একটি টেম্পলেট ফোল্ডার / ডিরেক্টরি কাঠামো তৈরি করুন যাতে আপনার ক্রিয়াকলাপ পরীক্ষা করার জন্য পর্যাপ্ত সামগ্রী রয়েছে।

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

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


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

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

2
@ ডক ব্রাউন - আমি ধরে নিচ্ছি যে তিনি ধীর, মুছে ফেলতে এবং টাইপ অপারেশনের নাম পরিবর্তন করতে চান যার সবকটি প্রান্তের মামলা রয়েছে যা ব্যঙ্গাত্মক হতে পারে would আধুনিক হার্ডওয়্যারগুলিতে ডিরেক্টরিতে কয়েকটি ছোট ফাইল আনজিপ করা জাভা ক্লাস লোড করার চেয়ে সামান্য ধীর - এটি সর্বোপরি আইও।
জেমস অ্যান্ডারসন

আমি টেস্ট ফাইল সিস্টেম সম্পর্কে যত বেশি ভাবি, ততই আমার এটি পছন্দ হয়।
ফ্রাঙ্ক হিলিমান

3

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

সুতরাং টিডিডি পদ্ধতির প্রথমে ইন্টিগ্রেশন টেস্ট লিখতে হবে (টিডিডি, কঠোরভাবে বলতে গেলে, 'ইউনিট টেস্ট' এবং 'ইন্টিগ্রেশন টেস্ট' এর স্বতন্ত্র ধারণা নেই; এগুলি কেবল পরীক্ষা)। বেশ সম্ভবত যথেষ্ট হবে; তাই কাজ শেষ, স্টপ, বাড়ি যাব

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

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


এই উত্তরটি সত্যই এটি আমার জন্য দৃষ্টিকোণে 'unit test' and 'integration test'; they are just tests.রেখেছিল - আমি বাস্তববাদীভাবে মনে করি, এটি আমার মামলার সেরা সমাধান হতে চলেছে - আমার প্রান্তের ক্ষেত্রে যে ফাইল সিস্টেমের লাইব্রেরিগুলি ব্যবহার করছি তা পরীক্ষা করতে হবে এবং অ্যাপ্লিকেশনটি কীভাবে সাড়া দিতে হবে সেগুলো. আমি যদি অন্য কোনও ফাইল সিস্টেমের লাইব্রেরিতে স্যুইচ করি তবে নতুন লাইব্রেরির সাথে কাজ করার জন্য আমার একগুচ্ছ মক / টেস্ট কোডটি পুনরায় লিখতে হবে না, তবে একটি পরীক্ষার ফোল্ডার কাঠামো এবং ইন্টিগ্রেশন টেস্ট থাকা এত সহজ করে তুলবে।
tehDorf

2

আমি আপনার প্রশ্নটিকে "ফাইল সিস্টেমের ক্রিয়াকলাপের উপর নির্ভর করে এমন একটি শ্রেণীর পরীক্ষা করার ভাল / গ্রহণযোগ্য উপায়" হিসাবে বুঝতে পারি। আমি অনুমান করি না যে আপনি নিজের ওএসের ফাইল সিস্টেম পরীক্ষা করতে চান।

@ আপনার ফাইল সিস্টেমের ক্রিয়াকলাপগুলিতে ইন্টারফেসগুলি রাখার প্রচেষ্টা চালিয়ে যাওয়ার জন্য এবং "এগুলি উপহাস" হিসাবে @ ডক ব্রাউন উত্তর যতটা ছোট প্রস্তাবিত হয়েছে জাভা বাইনারি স্ট্রিম বা পাঠ্য পাঠক (অথবা সি # বা তার সমতুল্য) ব্যবহার করা ভাল ধারণা আপনি যে প্রোগ্রামিং ল্যাঙ্গুয়েজটি ব্যবহার করছেন তা পরিবর্তে ফাইল ফাইলের নাম সহ ফাইলগুলি আপনার টিডিডি-ডেভেলপড ক্লাসে ব্যবহার করার পরিবর্তে

উদাহরণ:

জাভা ব্যবহার করে আমি CsvReader ক্লাস প্রয়োগ করেছি

public class CsvReader {
    private Reader reader;

    public CsvReader(Reader reader) {
        this.reader = reader;
    }
}

পরীক্ষার জন্য আমি মেমরির মতো ডেটা ব্যবহার করেছি

String contentOfCsv = "TestColumn1;TestColumn2\n"+
    "value1;value2\n";

CsvReader sut = new CsvReader(java.io.StringReader(contentOfCsv));

বা সংস্থানগুলিতে টেস্টডেটা অন্তর্ভুক্ত করুন

CsvReader sut = new CsvReader(getClass().getResourceAsStream("/data.csv"));

প্রযোজনায় আমি ফাইল সিস্টেমটি ব্যবহার করি

CsvReader sut = new CsvReader(new BufferedReader( new FileReader( "/import/Prices.csv" ) ));

এইভাবে আমার CsvReader ফাইল সিস্টেমের উপর নির্ভর করে না তবে একটি বিমূর্ত "রিডার" এর উপর নির্ভর করে যেখানে ফাইল সিস্টেমের প্রয়োগ রয়েছে।


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

এটা সঠিক।
কির্বিনেটর

1
আপনি আইডিয়েটাররিলিস্টার তৈরি করতে পারেন যার একটি স্ট্রিং রয়েছে [] তালিকা (স্ট্রিং ডিরেক্টরি); তারপরে ফেকডাইরেক্টরিলিস্টার কেবল নতুন স্ট্রিং [] {"।", "..", "foo.bat", "bar.exe" returning ফিরিয়ে এই পদ্ধতিটি প্রয়োগ করতে পারে;
অ্যান্ডার্স লিন্ডন

0

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

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