কিভাবে ডেটা অ্যাক্সেস স্তর পরীক্ষা করতে?


17

আমার কাছে একটি ডিএও পদ্ধতি রয়েছে যা জেডিবিসি অ্যাক্সেসের জন্য স্প্রিংকে ব্যবহার করে। এটি কোনও আইটেম বিক্রির বিক্রেতার সাফল্যের হার গণনা করে।

কোডটি এখানে:

public BigDecimal getSellingSuccessRate(long seller_id) {
    String sql = "SELECT SUM(IF(sold_price IS NOT NULL, 1, 0))/SUM(1) 
                  FROM transaction WHERE seller_id = ?";
    Object[] args = {seller_id};
    return getJdbcTemplate().queryForObject(sql, args, BigDecimal.class);
}

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


পরীক্ষা করে দেখুন DBUnit । এটি আপনার সমস্যা সমাধানের জন্য বিশেষভাবে তৈরি করা হয়েছে।
সার্জিও

উত্তর:


15

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

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

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

db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;

এটি testDataফাইল থেকে ডাটাবেসের স্থিতি (টেবিলগুলি, প্রাথমিক ডেটা) লোড করে । shutdown=trueশেষ সংযোগটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে ডাটাবেস বন্ধ হয়ে যাবে।

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

আপনার ডিএও তারপরে ইনজেকশন করা ডাটাবেস ব্যবহার করে যার জন্য আপনি ডাটাবেসের বিরুদ্ধে পরীক্ষা শুরু করতে পারেন।

ইউনিট পরীক্ষাগুলি এরপরে এমন কিছু দেখতে পাবেন (একঘেয়ে কাটানো স্টাফের গুচ্ছটি ব্রাভিটির জন্য অন্তর্ভুক্ত নয়):

    @Before
    public void setUpDB() {
        DBConnection connection = new DBConnection();
        try {
            conn = connection.getDBConnection();
            insert = conn.prepareStatement("INSERT INTO data (txt, ts, active) VALUES (?, ?, ?)");
        } catch (SQLException e) {
            e.printStackTrace();
            fail("Error instantiating database table: " + e.getMessage());
        }
    }

    @After
    public void tearDown() {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private void addData(String txt, Timestamp ts, boolean active) throws Exception {
        insert.setString(1, txt);
        insert.setTimestamp(2, ts);
        insert.setBoolean(3, active);
        insert.execute();
    }

    @Test
    public void testGetData() throws Exception {
        // load data
        Calendar time = Calendar.getInstance();
        long now = time.getTimeInMillis();
        long then1h = now - (60 * 60 * 1000);  // one hour ago
        long then2m = now - (60 * 1000 * 2);   // two minutes ago
        addData("active_foo", new Timestamp(then1h), true);     // active but old
        addData("inactive_bar", new Timestamp(then1h), false);  // inactive and old
        addData("active_quz", new Timestamp(then2m), true);     // active and new
        addData("inactive_baz", new Timestamp(then2m), false);  // inactive and new

        DataAccess dao = new DataAccess();
        int count = 0;
        for (Data data : dao.getData()) {
            count++;
            assertTrue(data.getTxt().startsWith("active"));
        }

        assertEquals("got back " + count + " rows instead of 1", count, 1);
    }

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

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

উপরের কোডটি একটি গৌণ প্রকল্পের অংশ যা আমি গিথাবের টেস্টিং উইথএইচসিএলডিবি ধারণার প্রমাণের জন্য লিখেছিলাম


2
এইচএসকিউএল যে কোনও ডিবি বিক্রেতার উপভাষাকে উপহাস করতে পারে সেই অংশটি সম্পর্কে আমি জানতাম না। ধন্যবাদ.
মাইকেল

1
@ ডগ এটি ডাটাবেস বৈশিষ্ট্যগুলির মাধ্যমে করা যেতে পারে যেমন sql.syntax_mys=truehsqldb এর কাজ করার পদ্ধতি পরিবর্তিত করে: "এই সম্পত্তিটি সত্য হয়ে গেলে, পাঠ এবং স্বতঃসৌধিক প্রকারের জন্য সমর্থন সক্ষম করে এবং এই উপভাষার অন্যান্য দিকগুলির সাথে সামঞ্জস্যতাও মঞ্জুর করে।" যখন sql.syntax_ora=trueআছে "এই সম্পত্তি, যখন প্রকৃত সেট, অ-মানক ধরনের জন্য সমর্থন উপলব্ধ করা হয়। এছাড়া দ্বৈত, ROWNUM যোগ করা হয়েছে, NEXTVAL এবং CURRVAL সিনট্যাক্স এবং সম্ভব এবং এই উপভাষা কিছু অন্যান্য দিক সাথে সামঞ্জস্যের অনুমতি দেয়।"

ডিবিউনিট হ'ল উপায় :)
সিলভিউ বুড়িয়া

@ সিলভিউবার্সিয়া ডিবিউনিট অবশ্যই হাতের নাগালের চেয়ে জটিল ডাটাবেস পরীক্ষার পরিবেশ স্থাপনের অনেকটা 'প্লাম্বিং' তৈরি করে। এটি আপনার হাতের সাহায্যে কীভাবে করা যায় তা এখনও কখনও কখনও দরকারী (উপরে বর্ণিত 'হাত দ্বারা' দৃষ্টিভঙ্গি অন্য ভাষাগুলিতে স্থানান্তরিত হতে পারে যেখানে DBUnit কোনও বিকল্প নয়)।

আপনি একটি চেহারা থাকতে পারে অনুচর
cchantep

2

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

আপনি যদি এটি করেন তবে আপনি বেশ কিছু কাজ করতে পারেন।

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

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

1

আমাদের প্রকল্পে, প্রতিটি বিকাশকারী একটি খালি ডেটাবেস চালাচ্ছে, এর কাঠামোটি উত্পাদন ডাটাবেসের মতোই।

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

এইভাবে, স্ক্যুয়াল স্তরটি পরীক্ষা করা সম্ভব। আসলে, প্রতিটি ক্যোয়ারী বা ডাটাবেস কলকে এইভাবে পরীক্ষা করতে হবে।

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


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

আগে কখনও সেভাবে করার কথা ভাবেনি। আমাদের পরীক্ষায়, বেশিরভাগ পরীক্ষাগুলি ব্যবহারকারী 'x' তৈরি করে যদিও এটি অনন্য। একবার একটি ডিবি তৈরির অর্থ সেই বিষয়গুলি পুনরায় ব্যবহারের জন্য পরীক্ষাগুলি পরিবর্তন করা।
কেরা 14

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

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