সম্পূর্ণ ক্লাস পুনরায় চলমান এবং টেস্টএনজিতে কেবলমাত্র @ টেস্ট নয়


9

আমি কিছুদিন যাবত স্ট্যাকওভারফ্লো ব্রাউজ করছি, কীভাবে পুরো @Testপদক্ষেপের ক্লাসটি পুনরায় চালাতে হবে তা চেষ্টা করার চেষ্টা করছিলাম, এবং কেবল একটি পদক্ষেপ নয়। অনেকে বলে থাকেন যে এটি টেস্টএনজি সমর্থন করে না এবং IRetryAnalyzerঅন্যদিকে কিছু পোস্ট করেছেন, যা সত্যিই কাজ করে না। কেউ কি এটা পরিচালনা করে? এবং কেবল এর কারণগুলি স্পষ্ট করার জন্য, যে উত্তরগুলি যে উদ্দেশ্য হিসাবে সমর্থিত নয় তা এড়াতে: টেস্টএনজি কেবলমাত্র বিকাশকারীদের পক্ষে নয় tool এর অর্থ e2e পরীক্ষার জন্য ডাব্লু টেস্টারের কাছ থেকেও ব্যবহৃত হয়। E2e পরীক্ষাগুলিতে এমন পদক্ষেপ থাকতে পারে যা প্রতিটি পূর্বের থেকে প্রতিটি নির্ভর করে। সুতরাং হ্যাঁ এটি @Testসহজেই পুরো টেস্ট ক্লাসটি পুনরায় চালনার বৈধ , যা সহজেই করা যায় IRetryAnalyzer

আমি যা অর্জন করতে চাই তার একটি উদাহরণ হ'ল:

public class DemoTest extends TestBase {

@Test(alwaysRun = true, description = "Do this")
public void testStep_1() {
    driver.navigate().to("http://www.stackoverflow.com");
    Assert.assertEquals(driver.getCurrentUrl().contains("stackoverflow)"));

}

@Test(alwaysRun = true, dependsOnMethods = "testStep_1", description = "Do that")
public void testStep_2() {
    driver.press("button");
    Assert.assertEquals(true, driver.elementIsVisible("button"));

}

@Test(alwaysRun = true, dependsOnMethods = "testStep_2", description = "Do something else")
public void testStep_3() {
   driver.press("button2");
Assert.assertEquals(true, driver.elementIsVisible("button"));

}

}

এর testStep_2ব্যর্থতা বলতে দিন , আমি পুনরায় চালু করতে চাই class DemoTestএবং শুধু নয় nottestStep_2


আপনি কি আমাদের কাজটি করতে পারেন যা কাজ করে না?
AndiCover

দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন, একটি নমুনা অন্তর্ভুক্ত করুন এবং আপনার প্রত্যাশা কী তা আমাদের দেখান। এটি অন্যদের আপনাকে এমন একটি উত্তর দিতে সাহায্য করবে যা আপনার প্রত্যাশা পূরণ করে।
কৃষ্ণন মহাদেবন

@AndiCover লিংক সমাধান নীচে উপস্থিত যে কাজ করে না (অথবা সমাধান নীচে উপস্থিত যে testNG যুক্তিবিজ্ঞান ধ্বংস হয়) হবে: stackoverflow.com/questions/25781098/... stackoverflow.com/questions/50241880/... stackoverflow.com/questions/53736621/...
gandalf_the_cool

উত্তর:


1

ঠিক আছে, আমি জানি যে আপনি সম্ভবত এমন কিছু সহজ সম্পত্তি চান যা আপনি আপনার @ বিফারক্লাসে বা সে জাতীয় কিছুতে নির্দিষ্ট করতে পারেন তবে এটি কার্যকর হওয়ার জন্য আমাদের অপেক্ষা করতে হতে পারে। কমপক্ষে আমি এটিও পেলাম না।

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

ঠিক আছে, তাই আমি আপনার মতো একটি টেস্ট ক্লাস তৈরি করেছি:

public class RetryTest extends TestConfig {

    public class RetryTest extends TestConfig {

        Assertion assertion = new Assertion();

        @Test(  enabled = true,
                groups = { "retryTest" },
                retryAnalyzer = TestRetry.class,
                ignoreMissingDependencies = false)
        public void testStep_1() {
        }

        @Test(  enabled = true,
                groups = { "retryTest" },
                retryAnalyzer = TestRetry.class,
                dependsOnMethods = "testStep_1",
                ignoreMissingDependencies = false)
        public void testStep_2() {
            if (fail) assertion.fail("This will fail the first time and not the second.");
        }

        @Test(  enabled = true,
                groups = { "retryTest" },
                retryAnalyzer = TestRetry.class,
                dependsOnMethods = "testStep_2",
                ignoreMissingDependencies = false)
        public void testStep_3() {
        }

        @Test(  enabled = true)
        public void testStep_4() {
            assertion.fail("This should leave a failure in the end.");
        }

    }


আমি অন্যান্য Listenerশ্রেণিতেও এটি প্রসারিত করতে চাইলে আমার কাছে সুপার ক্লাসে রয়েছে তবে আপনি শ্রোতাদের পাশাপাশি নিজের পরীক্ষা ক্লাসে সেট করতে পারেন।

@Listeners(TestListener.class)
public class TestConfig {
   protected static boolean retrySuccessful = false;
   protected static boolean fail = true;
}


উপরের চারটি পদ্ধতির মধ্যে তিনটি ক RetryAnalyzer। আমি testStep_4পরবর্তীটি যা করছি তা নির্বাহের বাকী অংশের সাথে বিশৃঙ্খলা সৃষ্টি করে না তা নিশ্চিত করার জন্য আমি এটি ছাড়াই রেখেছি। বলেছিল RetryAnalyzerআসলে পুনরায় চেষ্টা করবে না (নোটটি পদ্ধতিটি ফিরে আসে false) তবে এটি নিম্নলিখিতগুলি করবে:

public class TestRetry implements IRetryAnalyzer {

    public static TestNG retryTestNG = null;

    @Override
    public boolean retry(ITestResult result) {
        Class[] classes = {CreateBookingTest.class};

        TestNG retryTestNG = new TestNG();
        retryTestNG.setDefaultTestName("RETRY TEST");
        retryTestNG.setTestClasses(classes);
        retryTestNG.setGroups("retryTest");
        retryTestNG.addListener(new RetryAnnotationTransformer());
        retryTestNG.addListener(new TestListenerRetry());
        retryTestNG.run();

        return false;
    }

}


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

হ্যাঁ, আমি জানি, আমি জানি। এর অর্থ হল যে আপনি চিরকালীন লুপে আপনার পরীক্ষা স্যুটকে চিরতরে চালিত করতে চলেছেন। এজন্যই RetryAnnotationTransformer। এটিতে, আমরা সেই পরীক্ষাগুলির দ্বিতীয় কার্য সম্পাদন থেকে পুনরায় চেষ্টা করি:

public class RetryAnnotationTransformer extends TestConfig implements IAnnotationTransformer {

    @SuppressWarnings("rawtypes")
    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        fail = false; // This is just for debugging. Will make testStep_2 pass in the second run.
        annotation.setRetryAnalyzer(null);
    }

}


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

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

public class TestListenerRetry extends TestConfig implements ITestListener {

    (...)

    @Override
    public void onFinish(ITestContext context) {
        if (context.getFailedTests().size()==0 && context.getSkippedTests().size()==0) {
            successful = true;
        }
    }

}

এখন মূল স্যুটটির শ্রোতা, আপনি উপরে সুপার ক্লাসে যা দেখেছেন TestConfigতা দেখতে পাবে যে এটি রান হয়েছে কিনা এবং যদি এটি ভালভাবে চলে যায় এবং রিপোর্টটি আপডেট করবেন:

public class TestListener extends TestConfig implements ITestListener , ISuiteListener {

    (...)

    @Override
    public void onFinish(ISuite suite) {

        if (TestRetry.retryTestNG != null) {

            for (ITestNGMethod iTestNGMethod : suite.getMethodsByGroups().get("retryTest")) {

                Collection<ISuiteResult> iSuiteResultList = suite.getResults().values();

                for (ISuiteResult iSuiteResult : iSuiteResultList) {

                    ITestContext iTestContext = iSuiteResult.getTestContext();
                    List<ITestResult> unsuccessfulMethods = new ArrayList<ITestResult>();

                    for (ITestResult iTestResult : iTestContext.getFailedTests().getAllResults()) {
                        if (iTestResult.getMethod().equals(iTestNGMethod)) {
                            iTestContext.getFailedTests().removeResult(iTestResult);
                            unsuccessfulMethods.add(iTestResult);
                        }
                    }

                    for (ITestResult iTestResult : iTestContext.getSkippedTests().getAllResults()) {
                        if (iTestResult.getMethod().equals(iTestNGMethod)) {
                            iTestContext.getSkippedTests().removeResult(iTestResult);
                            unsuccessfulMethods.add(iTestResult);
                        }
                    }

                    for (ITestResult iTestResult : unsuccessfulMethods) {
                        iTestResult.setStatus(1);
                        iTestContext.getPassedTests().addResult(iTestResult, iTestResult.getMethod());
                    }

                }

            }

        }


    }

}

প্রতিবেদনে এখন দেখানো উচিত 3 টি পরীক্ষা পাস হয়েছে (তারা আবার চেষ্টা করেছিল) এবং একটি ব্যর্থ হয়েছে কারণ এটি অন্যান্য 3 টি পরীক্ষার অংশ ছিল না:

চূড়ান্ত রিপোর্ট


আমি জানি আপনি এটি যা খুঁজছেন তা নয়, তবে তারা টেস্টএনজিতে কার্যকারিতা যুক্ত না করা পর্যন্ত এটি আপনাকে পরিবেশন করতে সহায়তা করে।


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