কোনও মাভেন বিল্ডে সমান্তরালে জুনিট পরীক্ষা চলছে?


110

আমি JUnit 4.4 এবং মাভেন ব্যবহার করছি এবং আমার প্রচুর দীর্ঘমেয়াদী ইন্টিগ্রেশন পরীক্ষা রয়েছে।

যখন পরীক্ষার স্যুটগুলিকে সমান্তরাল করার কথা আসে তখন কয়েকটি সমাধান থাকে যা আমাকে প্রতিটি পরীক্ষার পদ্ধতিকে সমান্তরালভাবে একটি একক টেস্ট-ক্লাসে চালানোর অনুমতি দেয়। তবে এই সমস্তগুলিরই প্রয়োজন যে আমি পরীক্ষাগুলি একরকম বা অন্য কোনওভাবে পরিবর্তন করি change

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

এই কাজ করতে কোন উপায় আছে কি?

উত্তর:


75

মাভেন প্লাগইন ব্যবহার করুন:

<build>
    <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7.1</version>
        <configuration>
            <parallel>classes</parallel>
            <threadCount>5</threadCount>
        </configuration>
    </plugin>
    </plugins>
</build>

12
আপনি যদি জুনিট ৪.7 বা তার পরে ব্যবহার করেন তবে <সমান্তরাল> অবশ্যই ফায়ারফায়ার দ্বারা সমর্থিত। নিশ্চিত
ফায়ার

42

জুনিট ৪.7 থেকে এখন টেস্টএনজি ব্যবহার না করে সমান্তরালে পরীক্ষা চালানো সম্ভব। প্রকৃতপক্ষে এটি 6. since এর পরে থেকে সম্ভব হয়েছে, তবে ৪.7 এর মধ্যে বেশ কয়েকটি সংশোধন করা হচ্ছে যা এটি একটি কার্যকর বিকল্প হিসাবে তৈরি করবে। আপনি বসন্তের সাথে সমান্তরাল পরীক্ষাও চালাতে পারেন, যা আপনি এখানে পড়তে পারেন


1
লিঙ্কযুক্ত পৃষ্ঠাটি বলেছে "বেশিরভাগ দ্বৈত-কোর সমাধানের জন্য, সমান্তরাল থ্রেডের সাথে চলমান বর্তমানে অ-থ্রেডযুক্ত চালানোর চেয়ে দ্রুত আর কখনও হয় না"। এটা কি এখন ও সেই ঘটনা?
রায়েদওয়াল্ড

2
আমি মনে করি আপনার পরীক্ষাগুলি যদি কোনও আইও করে তবে তারা উপকৃত হবে। উদাহরণস্বরূপ, যদি আপনার ইউনিট পরীক্ষাগুলি আরও বেশি সংহতকরণ পরীক্ষার মতো হয় এবং ডাটাবেসগুলিতে আঘাত করে তবে সমান্তরালে চালানো তাদের দ্রুত করা উচিত।
ডেভ

@ রেয়েডওয়াল্ড সংক্ষিপ্ত নন-আইও-বাউন্ড ইউনিট পরীক্ষার জন্য খুব বেশি প্রত্যাশা করছেন যা আমি বলার চেষ্টা করছি। নিশ্চিত ফায়ার এর নতুন সংস্করণগুলি পোস্টে বর্ণিত 2.5 এর চেয়েও ভাল / আরও দক্ষ, যাতে আপনি কিছুটা ভাল ফলাফল পেতে পারেন।
krosenvold

3
আপনি এটি সম্ভব বলেছিলেন, তবে কীভাবে ব্যাখ্যা করার জন্য আপনি একটি লিঙ্ক অন্তর্ভুক্ত করতে পারেন? আপনার দ্বিতীয় লিঙ্কটি "বসন্তের সাথে" এর জন্য, যাতে আমি আগ্রহী নই
কোরি কেন্ডল

@ ক্রোজেনভোল্ড লিঙ্ক? আমি একটি অন্তর্নির্মিত সমাধান সন্ধানের জন্য লড়াই করছি।
ইলান বিয়াল

10

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

ParallelSuite.java

public class ParallelSuite extends Suite {

    public ParallelSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {

        super(klass, builder);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(4);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

ParallelParameterized.java

public class ParallelParameterized extends Parameterized {

    public ParallelParameterized(Class<?> arg0) throws Throwable {

        super(arg0);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(8);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

ব্যবহার সহজ। কেবলমাত্র @RunWith টীকাগুলির সাথে এই সমান্তরাল * শ্রেণীর একটিতে পরিবর্তন করুন ।

@RunWith(ParallelSuite.class)
@SuiteClasses({ATest.class, BTest.class, CTest.class})
public class ABCSuite {}

5

tempus-fugit অনুরূপ কিছু প্রস্তাব দেয়, বিশদগুলির জন্য ডক্সটি পরীক্ষা করুন। এটি JUnit 4.7 এর উপর নির্ভর করে এবং আপনি কেবল আপনার পরীক্ষাটি চিহ্নিত করেন@RunWith(ConcurrentTestRunner)

চিয়ার্স


3

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

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

অবশেষে, এখন পর্যন্ত কীভাবে এই সমস্যার সমাধান হয়েছে?


2

টেস্টএনজি এটি করতে পারে (এটি আমার প্রথম প্রতিচ্ছবি ছিল - তখন আমি দেখেছি যে আপনি ইতিমধ্যে অনেকগুলি টেস্টকেস নিচ্ছেন )।

JUnit এর জন্য সমান্তরাল-জুনিট দেখুন


3
দুর্ভাগ্যক্রমে এটি আমি যে প্রশ্নটি করছি তার উত্তর নয়। সমান্তরাল-জুনিট কেবল একটি একক পরীক্ষার ক্লাসের মধ্যে চলে। টেস্টএনজি কেবলমাত্র একটি একক শ্রেণীর মধ্যে চলে এবং আমার পরীক্ষাগুলি টেস্টএনজি পরীক্ষা নয়।
krosenvold

@ প্লাটিনাম অ্যাজুরি: আমি লিঙ্কটি আপডেট করেছি। আমি জানি না কীভাবে এই প্রকল্পটি বজায় রাখা হয়। সম্প্রতি আরও একটি প্রশ্ন বেশ কয়েকটি মেশিনে জুনিট টেস্টের সম্পাদন বিতরণ করতে বলা হয়েছিল ।
ফিলান্ট

2

জুনিট নিজেই সরবরাহ করেছেন প্যারালাল কম্পিউটার ব্যবহার করে আপনি সমান্তরালে পরীক্ষা চালাতে পারেন। আপনাকে শুরু করার জন্য এখানে একটি ছোট স্নিপেট।

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();

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

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


0

অন্য পছন্দ: পুনর, একটি নতুন সমান্তরাল জুনিট রানার এবং মাভেন প্লাগইন। আপনাকে আপনার কোড পরিবর্তন করতে হবে না, এটি আপনার pom.xML এ অনুলিপি করুন:

<!-- Disable default surefire based testing -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.20</version>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

<plugin>
  <groupId>com.github.marks-yag</groupId>
  <artifactId>punner-maven-plugin</artifactId>
  <version>${version}</version>
  <configuration>
  </configuration>
  <executions>
    <execution>
      <id>test</id>
      <phase>test</phase>
      <goals>
        <goal>test</goal>
      </goals>
    </execution>
  </executions>
</plugin>

পুনের সমান্তরালভাবে পরীক্ষা পদ্ধতি চালাতে পারে, পরীক্ষার ফলাফলগুলি আলাদা এবং পরিষ্কার রাখতে পারে।

পাঞ্জার আপনার এমভিএন কনসোল আউটপুটগুলি কমিয়ে দেবে:

[INFO] --- punner-maven-plugin:0.9.13:test (test) @ ipc ---
[INFO] Punner report directory: /Users/guile/workspace/ipc/target/punner-reports
[INFO]
[INFO] com.github.yag.ipc.IPCTest.testConnectionHandler.............. PASSED
[INFO] com.github.yag.ipc.IPCTest.testSequence....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testPartialContent................. PASSED
[INFO] com.github.yag.ipc.IPCTest.testResponseContent................ PASSED
[INFO] com.github.yag.ipc.IPCTest.testPingPong....................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerClose.................... PASSED
[INFO] com.github.yag.ipc.IPCTest.testServerSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeatTimeout..... PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientSideHeartbeat............ PASSED
[INFO] com.github.yag.ipc.IPCTest.testClientReconnect................ PASSED
[INFO]
[INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.952 sec, Time saved: 25.919 sec.

পুনার নিশ্চিত আগুনের সামঞ্জস্যপূর্ণ আউটপুট উত্পাদন করে, আপনি কাঁচা লগ ডেটা এবং রিপোর্ট ডিরেক্টরি থেকে একটি মার্কডাউন ফর্ম্যাট রিপোর্ট পেতে পারেন:

  ipc git:(develop) ll target/punner-reports
total 104
-rw-r--r--   1 guile  staff    11K Oct 15 23:07 TEST-com.github.yag.ipc.IPCTest.xml
-rw-r--r--   1 guile  staff   298B Oct 15 23:07 com.github.yag.ipc.IPCTest.txt
drwxr-xr-x  12 guile  staff   384B Oct  8 00:50 logs
-rw-r--r--   1 guile  staff    33K Oct 15 23:07 report.md

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

পুনরার কিছু উন্নত বৈশিষ্ট্য এখনও সমর্থন করে না। আপনি যদি চেষ্টা করে দেখতে পারেন এবং আমাকে কিছু প্রতিক্রিয়া জানাতে পারেন তবে আমি খুব আনন্দিত।


-3

আপনি আপনার পরীক্ষাটি এক মিনিটের মধ্যে টেস্টএনজি টেস্টে পরিবর্তন করতে পারেন (আপনার কেবলমাত্র আমদানি পরিবর্তন করতে হবে), সমান্তরাল পরীক্ষায় টেস্টএনজি সেরা।


-3

আপনি গ্রিডগেইন চেষ্টা করে দেখতে পারেন যা আপনাকে একটি পরীক্ষার গ্রিড জুড়ে আপনার পরীক্ষাগুলি বিতরণ করতে দেয়।


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