কিভাবে একটি বেসরকারী নির্মাণে পরীক্ষার কাভারেজ যুক্ত করবেন?


110

এই কোড:

package com.XXX;
public final class Foo {
  private Foo() {
    // intentionally empty
  }
  public static int bar() {
    return 1;
  }
}

এটি পরীক্ষা:

package com.XXX;
public FooTest {
  @Test 
  void testValidatesThatBarWorks() {
    int result = Foo.bar();
    assertEquals(1, result);
  }
  @Test(expected = java.lang.IllegalAccessException.class)
  void testValidatesThatClassFooIsNotInstantiable() {
    Class cls = Class.forName("com.XXX.Foo");
    cls.newInstance(); // exception here
  }
}

ভাল কাজ করে, ক্লাস পরীক্ষা করা হয়। কিন্তু কোবার্টুরা বলেছেন যে শ্রেণীর বেসরকারী নির্মাণকারীর শূন্য কোড কভারেজ রয়েছে। এই জাতীয় বেসরকারী নির্মাণে কীভাবে আমরা পরীক্ষার কাভারেজ যুক্ত করতে পারি?


আমার কাছে মনে হচ্ছে আপনি সিঙ্গলটন প্যাটার্নটি প্রয়োগ করার চেষ্টা করছেন। যদি তা হয় তবে আপনি dp4j.com পছন্দ করতে পারেন (যা ঠিক এটি করে)
22:59

"ইচ্ছাকৃতভাবে খালি" নিক্ষেপ ব্যতিক্রম সঙ্গে প্রতিস্থাপন করা উচিত নয়? সেক্ষেত্রে আপনি পরীক্ষা লিখতে পারেন যা নির্দিষ্ট বার্তার সাথে সেই নির্দিষ্ট ব্যতিক্রমের প্রত্যাশা করে, না? নিশ্চিত না যে এটি ওভারকিল কিনা
ইওকস

উত্তর:


85

ঠিক আছে, এমন কিছু উপায় রয়েছে যা আপনি সম্ভাব্যভাবে প্রতিবিম্ব ইত্যাদি ব্যবহার করতে পারেন - তবে এটি কি সত্যই মূল্যবান? এটি এমন একটি কনস্ট্রাক্টর যা ডাকা হবে না , তাই না?

কোবার্টুরাকে বোঝাবার জন্য ক্লাসে যোগ করতে পারেন এমন কোনও টীকাগুলি বা এর অনুরূপ অন্য কিছু থাকলে, এটি বলা হবে না, তা করুন: কৃপিতভাবে কভারেজ যুক্ত করার জন্য হুপের মধ্য দিয়ে যাওয়া উচিত বলে আমি মনে করি না।

সম্পাদনা: এটি করার কোনও উপায় না থাকলে, কিছুটা কমে যাওয়া কভারেজের সাথেই থাকুন। মনে রাখবেন যে কভারেজ কিছু যা দরকারী হতে বোঝানো হয় আপনি - আপনি টুল, না অন্যান্য উপায় বৃত্তাকার ভারপ্রাপ্ত থাকা উচিত নয়।


18
আমি কেবলমাত্র এই বিশেষ
নির্মাতার

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

19
@ জোনস্কিট: আমি "কোনও সরঞ্জামের গোলাম হতে যাব না" এর সাথে আমি সম্পূর্ণরূপে একমত, তবে প্রতিটি প্রকল্পের প্রতিটি "ত্রুটি গণনা" মনে রাখা ভাল গন্ধ হয় না। কীভাবে নিশ্চিত করা যায় যে 7/9 ফলাফলটি কোবার্টুরার সীমাবদ্ধতা, এবং প্রোগ্রামারের নয়? একটি নতুন প্রোগ্রামারকে অবশ্যই প্রতিটি ব্যর্থতা প্রবেশ করতে হবে (এটি বড় প্রকল্পগুলিতে অনেক কিছু হতে পারে) ক্লাস-ক্লাস-ক্লাস পরীক্ষা করতে।
এডুয়ার্ডো কস্তা

5
এটি প্রশ্নের উত্তর দেয় না। এবং যাইহোক, কিছু পরিচালক কভারেজ নম্বরগুলি দেখেন। তারা কেন চিন্তা করে না। তারা জানে যে 85% 75% এর চেয়ে ভাল।
এসিভি

2
অন্যথায় অ্যাক্সেসযোগ্য কোড পরীক্ষা করার জন্য ব্যবহারিক ব্যবহারের ক্ষেত্রে হ'ল 100% পরীক্ষার কভারেজ অর্জন করা যাতে কাউকে আবার সেই শ্রেণীর দিকে তাকাতে না হয়। যদি কভারেজটি 95% এ আটকে থাকে তবে অনেকগুলি বিকাশকারী বারবার এই সমস্যাটি ঘুরিয়ে দেওয়ার কারণটি খুঁজে বের করার চেষ্টা করতে পারে।
thisismydesign

140

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

@Test
public void testConstructorIsPrivate() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
  Constructor<Foo> constructor = Foo.class.getDeclaredConstructor();
  assertTrue(Modifier.isPrivate(constructor.getModifiers()));
  constructor.setAccessible(true);
  constructor.newInstance();
}

25
তবে এটি পরীক্ষার স্যুটটিতে শোরগোল যুক্ত করে কভারেজ রিপোর্টে গোলমাল দূর করছে । আমি "আদর্শবাদকে একপাশে রেখে দাও" - এ বাক্যটি স্রেফ শেষ করে দিতাম। :)
ক্রিস্টোফার অর

11
এই পরীক্ষার যেকোন ধরণের অর্থ দেওয়ার জন্য, আপনার সম্ভবত এটিও দৃ should়ভাবে বলা উচিত যে নির্ধারকের অ্যাক্সেস স্তরটি আপনি যা প্রত্যাশা করেছেন তা।
জেরেমি

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

1
এটি সিনট্যাক্টিক্যালি ভুল তাই না? কী constructor? Constructorপরামিতি করা উচিত নয় এবং কোনও কাঁচা টাইপ নয়?
অ্যাডাম পার্কিন

2
এটি ভুল: constructor.isAccessible()সর্বদা মিথ্যা এমনকি পাবলিক কনস্ট্রাক্টরকেও ফিরিয়ে দেয়। এক ব্যবহার করা উচিত assertTrue(Modifier.isPrivate(constructor.getModifiers()));
টাইমোমেনেন

78

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

/**
 * Verifies that a utility class is well defined.
 * 
 * @param clazz
 *            utility class to verify.
 */
public static void assertUtilityClassWellDefined(final Class<?> clazz)
        throws NoSuchMethodException, InvocationTargetException,
        InstantiationException, IllegalAccessException {
    Assert.assertTrue("class must be final",
            Modifier.isFinal(clazz.getModifiers()));
    Assert.assertEquals("There must be only one constructor", 1,
            clazz.getDeclaredConstructors().length);
    final Constructor<?> constructor = clazz.getDeclaredConstructor();
    if (constructor.isAccessible() || 
                !Modifier.isPrivate(constructor.getModifiers())) {
        Assert.fail("constructor is not private");
    }
    constructor.setAccessible(true);
    constructor.newInstance();
    constructor.setAccessible(false);
    for (final Method method : clazz.getMethods()) {
        if (!Modifier.isStatic(method.getModifiers())
                && method.getDeclaringClass().equals(clazz)) {
            Assert.fail("there exists a non-static method:" + method);
        }
    }
}

আমি সম্পূর্ণ কোড এবং উদাহরণগুলি https://github.com/trajano/maven-jee6/tree/master/maven-jee6-est এ রেখেছি


11
+1 এটি কেবল সরঞ্জামটিকে ট্রিকিং না করেই সমস্যার সমাধান করে না, তবে এটি কোনও ইউটিলিটি ক্লাস স্থাপনের কোডিং মানকে পুরোপুরি পরীক্ষা করে। আমি ব্যবহার অভিগম্যতা পরীক্ষা পরিবর্তন করতে হয়েছিল Modifier.isPrivateযেমন isAccessibleফিরছিলেন trueকিছু ক্ষেত্রে ব্যক্তিগত কনস্ট্রাকটর জন্য (গ্রন্থাগার হস্তক্ষেপ উপহাস?)।
ডেভিড হার্কনেস

4
আমি সত্যিই এটি JUnit এর দৃsert় ক্লাসে যুক্ত করতে চাই, তবে আপনার কাজের জন্য কৃতিত্ব নিতে চাই না। আমি মনে করি এটি খুব ভাল। এটা আছে মহান হবে Assert.utilityClassWellDefined()JUnit 4.12+ হবে। আপনি কি একটি টানার অনুরোধ বিবেচনা করেছেন?
ভিশনারি সফ্টওয়্যার সলিউশন

নোট করুন যে setAccessible()কনস্ট্রাক্টরকে অ্যাক্সেসযোগ্য করে তুলতে সোনার কোড কভারেজ সরঞ্জামের জন্য সমস্যা সৃষ্টি করে (যখন আমি এটি করি তখন সোনার কোড কভারেজ রিপোর্টগুলি ক্লাসটি অদৃশ্য হয়ে যায়)।
অ্যাডাম পার্কিন

ধন্যবাদ, আমি যদিও অ্যাক্সেসযোগ্য পতাকাটি পুনরায় সেট করি। সম্ভবত এটি সোনার নিজেই একটি বাগ?
আর্কিমিডিস ট্রাজানো

আমি আমার বাটিক মাভেন প্লাগইনে কভারেজের জন্য আমার সোনার প্রতিবেদনের দিকে তাকালাম, মনে হচ্ছে এটি সঠিকভাবে কভার হয়েছে। সাইট.trajano.net/batik-maven-plugin/cobertura/index.html
আর্কিমিডিস ট্রাজানো

19

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

@Test(expected=IllegalAccessException.class)
public void testConstructorPrivate() throws Exception {
    MyUtilityClass.class.newInstance();
    fail("Utility class constructor should be private");
}

আমি জাভিদ জামা'র পরামর্শ নিয়েছিলাম এবং প্রতিবিম্ব ব্যবহার করেছি, তবে ক্লাস পরীক্ষা-নিরীক্ষার সাথে যে কেউ গণ্ডগোল করছে তাকে ধরার জন্য যুক্তি যুক্ত করেছিলাম (এবং পরীক্ষার নাম উচ্চতর স্তর নির্দেশ করে) indicate

@Test
public void evilConstructorInaccessibilityTest() throws Exception {
    Constructor[] ctors = MyUtilityClass.class.getDeclaredConstructors();
    assertEquals("Utility class should only have one constructor",
            1, ctors.length);
    Constructor ctor = ctors[0];
    assertFalse("Utility class constructor should be inaccessible", 
            ctor.isAccessible());
    ctor.setAccessible(true); // obviously we'd never do this in production
    assertEquals("You'd expect the construct to return the expected type",
            MyUtilityClass.class, ctor.newInstance().getClass());
}

এটি এত বেশি পরিমাণে, তবে আমি স্বীকার করতে চাই যে আমি 100% পদ্ধতির কভারেজের উষ্ণ ফাজি অনুভূতিটি পছন্দ করি।


ওভারকিল এটি হতে পারে তবে এটি ইউনিটিলস বা অন্য জাতীয় কিছু হলে আমি এটি ব্যবহার করতাম
স্টুয়ার্ট


প্রথম উদাহরণটি কাজ করে না - IllegalAccesException এর অর্থ কনস্ট্রাক্টরকে কখনই ডাকা হয় না, তাই কভারেজ রেকর্ড করা হয় না।
টম ম্যাকআইন্টির

আইএমও, প্রথম কোড স্নিপেটের সমাধান হ'ল এই আলোচনার মধ্যে পরিষ্কার এবং সহজতম। শুধু সাথে লাইন fail(...)প্রয়োজন হয় না।
পাইটর উইটচেন

9

সঙ্গে জাভা 8 , এটি অন্যান্য সমাধান খুঁজে বের করার সম্ভব।

আমি ধরে নিলাম যে আপনি কয়েকটি পাবলিক স্ট্যাটিক পদ্ধতিতে কেবল ইউটিলিটি ক্লাস তৈরি করতে চান। আপনি যদি জাভা 8 ব্যবহার করতে পারেন তবে তার interfaceপরিবর্তে আপনি ব্যবহার করতে পারেন ।

package com.XXX;

public interface Foo {

  public static int bar() {
    return 1;
  }
}

কোবার্টুরা থেকে কোনও নির্মাতা এবং কোনও অভিযোগ নেই। এখন আপনাকে কেবল সেই লাইনের পরীক্ষা করতে হবে যা আপনি সত্যই যত্নবান হন।


1
দুর্ভাগ্যক্রমে, আপনি ইন্টারফেসটিকে "চূড়ান্ত" হিসাবে ঘোষণা করতে পারবেন না, কাউকে এটিকে সাবক্লাসিং থেকে আটকাতে পারবেন - অন্যথায় এটি সর্বোত্তম পন্থা হবে।
মাইকেল বেরি

5

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

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

একটি নিখুঁত বিশ্বে সমস্ত কোড কভারেজ সরঞ্জামগুলি চূড়ান্ত শ্রেণীর অন্তর্ভুক্ত এমন প্রাইভেট কনস্ট্রাক্টরগুলিকে উপেক্ষা করবে কারণ কনস্ট্রাক্টর সেখানে "সুরক্ষা" পরিমাপ ছাড়া আর কিছুই নেই :)
আমি এই কোডটি ব্যবহার করব:

    @Test
    public void callPrivateConstructorsForCodeCoverage() throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
    {
        Class<?>[] classesToConstruct = {Foo.class};
        for(Class<?> clazz : classesToConstruct)
        {
            Constructor<?> constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            assertNotNull(constructor.newInstance());
        }
    }
এবং তারপরে আপনি অ্যারেতে ক্লাস যুক্ত করুন।


5

কোবার্টুরার নতুন সংস্করণগুলিতে তুচ্ছ গিটার / সেটটার / কনস্ট্রাক্টরদের উপেক্ষা করার জন্য অন্তর্নির্মিত সমর্থন রয়েছে:

https://github.com/cobertura/cobertura/wiki/Ant-Task-Reference#ignore-trivial

তুচ্ছ উপেক্ষা করুন

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

<cobertura-instrument ignoreTrivial="true" />

বা গ্রেডল বিল্ডে:

cobertura {
    coverageIgnoreTrivial = true
}

4

না। খালি কনস্ট্রাক্টর পরীক্ষা করার কী লাভ? যেহেতু কোবার্টুরা ২.০ তে এই ধরনের তুচ্ছ ঘটনাগুলি উপেক্ষা করার বিকল্প রয়েছে (একসাথে সেটার / গেটারদের সাথে), আপনি কোবার্টুরা মাভেন প্লাগইনে কনফিগারেশন বিভাগ যুক্ত করে এটি মাভেনে সক্ষম করতে পারেন:

<configuration>
  <instrumentation>
    <ignoreTrivial>true</ignoreTrivial>                 
  </instrumentation>
</configuration>

অন্যথায় আপনি ব্যবহার করতে পারেন কভারেজ টীকা : @CoverageIgnore


3

অবশেষে, সমাধান আছে!

public enum Foo {;
  public static int bar() {
    return 1;
  }
}

প্রশ্নটিতে পোস্ট করা ক্লাসটি কীভাবে পরীক্ষা করছে? আপনার ধরে নেওয়া উচিত নয় যে আপনি একটি প্রাইভেট কনস্ট্রাক্টর দিয়ে প্রতিটি ক্লাসকে এনামে পরিণত করতে পারেন, বা আপনি চান।
জন স্কিটি

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

1
একটি প্রাইভেট কনস্ট্রাক্টর সহ একটি ক্লাস পাবলিক স্ট্যাটিক পদ্ধতিগুলি থেকে তাত্ক্ষণিকভাবে চালু করা যেতে পারে, তবে অবশ্যই এটির কভারেজ পাওয়া সহজ। তবে মৌলিকভাবে আমি এমন কোনও শ্রেণিকে পছন্দ করব যা Enum<E>প্রকৃতপক্ষে এনাম হতে হবে ... আমি বিশ্বাস করি যে উদ্দেশ্যটি আরও ভাল প্রকাশ করে।
জন স্কিটি

4
বাহ, আমি পুরোপুরি কোডটি পছন্দ করব যা একটি সুন্দর স্বেচ্ছাসেবী সংখ্যার চেয়ে ভাল বোঝায়। (কভারেজ মানের কোন গ্যারান্টি, না সব ক্ষেত্রে 100% কভারেজ সম্ভবপর হলে আপনার পরীক্ষার উচিত নয়। গাইড শ্রেষ্ঠ সময়ে আপনার কোড -। উদ্ভট ইচ্ছা একটি খাড়া বাঁধ ধরে বাহা নয়)
জন স্কিট

1
@ ক্যান: টুলটি ব্লফ করার জন্য কনস্ট্রাক্টরের কাছে একটি ডামি কল যুক্ত করা উদ্দেশ্য নয় should যে কেউ প্রকল্পের মঙ্গল নির্ধারণের জন্য একক মেট্রিকের উপর নির্ভর করে ইতিমধ্যে ধ্বংসের পথে।
অপুরভ খুরসিয়া

1

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


1

অন্য বিকল্পটি হ'ল নিম্নলিখিত কোডের মতো একটি স্ট্যাটিক ইনিশিয়ালাইজার তৈরি করা

class YourClass {
  private YourClass() {
  }
  static {
     new YourClass();
  }

  // real ops
}

এইভাবে ব্যক্তিগত নির্মাণকারীকে পরীক্ষিত হিসাবে বিবেচনা করা হয় এবং রানটাইম ওভারহেড মূলত পরিমাপযোগ্য নয়। আমি EclEmma ব্যবহার করে 100% কভারেজ পেতে এটি করি, তবে সম্ভবত এটি প্রতিটি কভারেজ সরঞ্জামের জন্য কার্যকর হয়। অবশ্যই এই সমাধানটির অপূর্ণতা হ'ল আপনি পরীক্ষার কোডটি (স্ট্যাটিক ইনিশিয়ালাইজার) কেবল পরীক্ষার উদ্দেশ্যেই লেখেন।


আমি এটি বেশ কিছুটা করি। সস্তা হিসাবে সস্তা, নোংরা হিসাবে সস্তা, কিন্তু কার্যকর।
ফোলেসার

সোনার সহ, এটি আসলে কোড কভারেজ দ্বারা ক্লাসটি পুরোপুরি মিস করে।
অ্যাডাম পার্কিন

1

ClassUnderTest টেস্টক্লাস = হোয়াইটবক্স.ইনওককন্সট্রাক্টর (ClassUenderTest.class);


এটি সঠিক উত্তর হওয়া উচিত ছিল কারণ এটি যা জিজ্ঞাসিত তা ঠিক উত্তর দেয়।
চাকিয়ান

0

কখনও কখনও কোবার্টুরার চিহ্ন কোডগুলি 'আচ্ছাদিত নয়' হিসাবে কার্যকর করার উদ্দেশ্যে নয়, এতে কোনও দোষ নেই। 99%পরিবর্তে কভারেজ থাকার বিষয়ে আপনি কেন উদ্বিগ্ন 100%?

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


0

আমি যদি আপনার প্রশ্নের অভিপ্রায় অনুমান করি তবে আমি বলব:

  1. আপনি প্রকৃত কাজ করে এমন ব্যক্তিগত নির্মাণকারীদের জন্য যুক্তিসঙ্গত চেকগুলি চান এবং এবং
  2. আপনি ক্লোজারটি ব্যবহার শ্রেণীর জন্য খালি নির্মাণকারীদের বাদ দিতে চান।

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

উদাহরণস্বরূপ, যদি আমার [বেসরকারী] কনস্ট্রাক্টর আমার ক্লাসের উদাহরণ ক্ষেত্রগুলিতে সেট আপ aকরে 5। তারপরে আমি এটি পরীক্ষা করতে পারি (বা বরং অবশ্যই):

@Test
public void testInit() {
    MyClass myObj = MyClass.newInstance(); //Or whatever factory method you put
    Assert.assertEquals(5, myObj.getA()); //Or if getA() is private then test some other property/method that relies on a being 5
}

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

<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
    <methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
</clover-setup>

আমি ইচ্ছাকৃতভাবে .*নিম্নলিখিতটি বাদ দিয়েছি )কারণ এই ধরনের নির্মাতারা ব্যতিক্রম ছুঁড়ে ফেলার উদ্দেশ্যে নয় (তারা কিছু করার জন্য নয়)।

অবশ্যই একটি তৃতীয় কেস হতে পারে যেখানে আপনি একটি অ-ইউটিলিটি ক্লাসের জন্য খালি কনস্ট্রাক্টর রাখতে চাইতে পারেন। এই ধরনের ক্ষেত্রে, আমি আপনাকে পরামর্শ দেব যে আপনি methodContextনির্মাণকারীর সঠিক স্বাক্ষর সহ একটি রাখুন ।

<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
    <methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+Util *( *) *"/>
    <methodContext name="myExceptionalClassCtor" regexp="^private MyExceptionalClass()$"/>
</clover-setup>

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

<clover-setup initString="${build.dir}/clovercoverage.db" enabled="${with.clover}">
    <methodContext name="prvtCtor" regexp="^private *[a-zA-Z0-9_$]+ *( *) .*"/>
</clover-setup>

0
@Test
public void testTestPrivateConstructor() {
    Constructor<Test> cnt;
    try {
        cnt = Test.class.getDeclaredConstructor();
        cnt.setAccessible(true);

        cnt.newInstance();
    } catch (Exception e) {
        e.getMessage();
    }
}

টেস্ট.জভা আপনার উত্স ফাইল যা আপনার ব্যক্তিগত নির্মাণকারীর হাতে রয়েছে


এটি ব্যাখ্যা করে সুন্দর হবে, কেন এই নির্মাণটি কভারেজটিতে সহায়তা করে।
মার্কাস

সত্য, এবং দ্বিতীয়ত: কেন আপনার পরীক্ষায় ব্যতিক্রম ধরা হচ্ছে? নিক্ষেপ করা ব্যতিক্রম আসলে পরীক্ষায় ব্যর্থ হওয়া উচিত।
জর্ডি

0

লম্বোক টীকা @ ইউটিলিটি ক্লাস দিয়ে তৈরি ক্লাসে নিম্নলিখিতটি আমার সাথে কাজ করেছে, যা স্বয়ংক্রিয়ভাবে একটি প্রাইভেট কনস্ট্রাক্টর যুক্ত করে।

@Test
public void testConstructorIsPrivate() throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
    Constructor<YOUR_CLASS_NAME> constructor = YOUR_CLASS_NAME.class.getDeclaredConstructor();
    assertTrue(Modifier.isPrivate(constructor.getModifiers())); //this tests that the constructor is private
    constructor.setAccessible(true);
    assertThrows(InvocationTargetException.class, () -> {
        constructor.newInstance();
    }); //this add the full coverage on private constructor
}

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


হাই @ শান্তেশ্বর ইন্ডি অনেক ধন্যবাদ. আপনার ইনপুটটি আপনার পরামর্শ অনুসারে সম্পাদিত হয়েছে এবং সম্পূর্ণ হয়েছে। শুভেচ্ছা।
রিকার্ডো সোলিমেনা

0

2019 এ আমার পছন্দসই বিকল্প: লম্বোক ব্যবহার করুন।

বিশেষত, @UtilityClassটিকা । (দুঃখের বিষয় লেখার সময় কেবল "পরীক্ষামূলক" তবে এটি ঠিকঠাকভাবে কাজ করে এবং ইতিবাচক দৃষ্টিভঙ্গি রয়েছে, তাই শীঘ্রই স্থিতিশীলতায় উন্নীত হওয়ার সম্ভাবনা রয়েছে))

এই টীকাটি তাত্ক্ষণিকতা প্রতিরোধের জন্য প্রাইভেট কনস্ট্রাক্টর যুক্ত করবে এবং ক্লাসটি চূড়ান্ত করবে। যখন একত্রে মিলিত lombok.addLombokGeneratedAnnotation = trueহয় lombok.config, পরীক্ষার কভারেজ গণনা করার সময়, সমস্ত পরীক্ষামূলক ফ্রেমওয়ার্কগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন কোডটিকে উপেক্ষা করবে, আপনাকে কোনও হ্যাক বা প্রতিবিম্ব ছাড়াই সেই স্বয়ংক্রিয় উত্পন্ন কোডের কভারেজ বাইপাস করতে দেয়।


-2

আপনি পারবেন না।

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


3
এটি ভুল; আপনি উপরে উল্লিখিত হিসাবে, প্রতিবিম্ব মাধ্যমে এটি ইনস্ট্যান্ট করতে পারেন।
থিওথেরিয়ান

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