JUnit vs TestNG [ditutup]


125

Di tempat kerja kami saat ini masih menggunakan JUnit 3 untuk menjalankan pengujian kami. Kami telah mempertimbangkan untuk beralih ke JUnit 4 untuk tes baru yang sedang ditulis tetapi saya telah mengawasi TestNG untuk sementara waktu sekarang. Pengalaman apa yang Anda semua miliki dengan JUnit 4 atau TestNG, dan mana yang tampaknya bekerja lebih baik untuk sejumlah besar pengujian? Memiliki fleksibilitas dalam tes tertulis juga penting bagi kami karena tes fungsional kami mencakup aspek yang luas dan perlu ditulis dalam berbagai cara untuk mendapatkan hasil.

Tes lama tidak akan ditulis ulang karena mereka melakukan tugasnya dengan baik. Apa yang ingin saya lihat dalam pengujian baru adalah fleksibilitas dalam cara penulisan pengujian, pernyataan natural, pengelompokan, dan eksekusi pengujian yang didistribusikan dengan mudah.


10
Ada perubahan dari 08 ke sekarang ????
some_other_guy

Cukup gunakan TestNG, ia mendapatkan semua yang Junit miliki, dan banyak lagi!
Eric Wang

Jawaban:


67

Saya telah menggunakan keduanya, tetapi saya harus setuju dengan Justin Standard bahwa Anda tidak perlu benar-benar mempertimbangkan untuk menulis ulang tes Anda yang ada ke format baru. Terlepas dari keputusannya, cukup sepele untuk menjalankan keduanya. TestNG berusaha untuk menjadi jauh lebih dapat dikonfigurasi daripada JUnit, tetapi pada akhirnya keduanya bekerja sama dengan baik.

TestNG memiliki fitur yang rapi di mana Anda dapat menandai pengujian sebagai grup tertentu, dan kemudian dengan mudah menjalankan semua pengujian grup tertentu, atau mengecualikan pengujian grup tertentu. Dengan demikian, Anda dapat menandai pengujian yang berjalan lambat seperti pada grup "lambat" dan kemudian mengabaikannya saat Anda menginginkan hasil yang cepat. Saran dari dokumentasi mereka adalah menandai beberapa subset sebagai tes "check in" yang harus dijalankan setiap kali Anda memeriksa file baru. Saya tidak pernah melihat fitur seperti itu di JUnit, tetapi sekali lagi, jika Anda tidak memilikinya, Anda tidak memilikinya. T BENAR-BENAR melewatkannya.

Untuk semua klaimnya tentang konfigurasi tinggi, saya mengalami kasus sudut beberapa minggu yang lalu di mana saya tidak dapat melakukan apa yang ingin saya lakukan ... Saya berharap saya dapat mengingat apa itu, tetapi saya ingin mengungkitnya jadi Anda tahu bahwa itu tidak sempurna.

Keuntungan terbesar yang dimiliki TestNG adalah anotasi ... yang ditambahkan JUnit di versi 4.


14
JUnit dapat melakukan pengelompokan yang Anda bicarakan dengan menentukan rangkaian pengujian, lalu menambahkan pengujian dalam kelompok yang diinginkan ke rangkaian tersebut. Anda kemudian dapat menyiapkan target di skrip ant Anda yang hanya menjalankan suite itu, dan menyiapkan kontrol sumber Anda untuk menjalankan target tersebut saat check in.
Justin Standard

8
Keuntungan terbesar yang dimiliki TestNG dibandingkan JUnit adalah kemampuan untuk menghasilkan data pengujian secara dinamis untuk pengujian berparameter. Setiap elemen data uji adalah "test" yang berbeda, sehingga membuatnya sangat mudah untuk membuat data-driven tes testng.org/doc/documentation-main.html#parameters
davetron5000

6
Tes berparameter mudah dilakukan dengan Teori, yang terintegrasi dalam versi terbaru Junit (tetapi masih eksperimental saat ini).
Mnementh

9
Grup TestNG dapat dilakukan di JUnit 4.8 dengan Kategori: kentbeck.github.com/junit/doc/ReleaseNotes4.8.html .
Kaitsu

Beberapa hal yang tidak disebutkan: Saya pikir keunggulan terbaik TestNG adalah dapat meneruskan parameter yang sama yang Anda lewati ke setiap metode pengujian, juga ke metode konfigurasi pengujian sebelum / sesudah: ini sangat membantu dalam penyiapan dan pembongkaran, IMHO sangat kuat. Jika Anda tidak memahaminya, Anda mungkin berpikir Anda tidak membutuhkannya. Juga, saya suka bagaimana Anda dapat mendefinisikan rangkaian pengujian dalam kode.
djangofan

20

Pertama saya akan mengatakan, jangan menulis ulang semua tes Anda hanya untuk menyesuaikan dengan mode terbaru. Junit3 bekerja dengan sangat baik, dan pengenalan anotasi dalam 4 tidak banyak membantu Anda (menurut saya). Jauh lebih penting bahwa kalian menulis tes, dan sepertinya Anda melakukannya.

Gunakan apa pun yang tampak paling alami dan membantu Anda menyelesaikan pekerjaan.

Saya tidak dapat mengomentari TestNG b / c Saya belum menggunakannya. Tetapi saya akan merekomendasikan unitils , pembungkus yang bagus untuk JUnit / TestNG / DBUnit / EasyMock, terlepas dari rute mana yang Anda ambil. (Ini mendukung semua rasa yang disebutkan di atas)


1
Unitils sepertinya tidak diperbarui beberapa lama; akankah ini bekerja dengan versi JUnit / TestNG yang lebih baru?
Chinasaur

Hanya untuk siapa pun yang menemukan jawaban ini pada tahun 2011, saya memeriksa, dan versi unitils terbaru (3.2), memiliki tanggal rilis: 2011-09-29. Jadi yang sedang aktif dipertahankan.
Ogre Psalm33

18

Kartu undian terbesar TestNG bagi saya mencakup kelompok uji dukungannya, dan yang lebih penting - ketergantungan kelompok uji (menandai suatu uji sebagai bergantung pada suatu kelompok menyebabkan pengujian tidak berjalan begitu saja ketika kelompok terikat gagal).

Kartu undian besar TestNG lainnya bagi saya termasuk parameter uji, penyedia data, trafo anotasi, dan lebih dari segalanya - komunitas pengguna yang dinamis dan responsif.

Sementara di permukaan orang mungkin tidak berpikir semua fitur TestNG di atas mungkin tidak diperlukan, begitu Anda mulai memahami fleksibilitas yang dibawa ke pengujian Anda, Anda akan bertanya-tanya bagaimana Anda mengatasi JUnit.

(penafian - Saya sama sekali tidak menggunakan JUnit 4.x, jadi saya tidak dapat mengomentari kemajuan atau fitur baru di sana).


3
Saya menggunakan JUnit4 dan TestNG, TestNG memiliki dukungan yang lebih baik untuk integrasi uji pegas pegas. Membuat pengujian aplikasi berbasis pegas jauh lebih mudah.
hidralisk

18

Sekitar setahun yang lalu, kami mengalami masalah yang sama. Saya menghabiskan beberapa waktu untuk mempertimbangkan langkah mana yang lebih baik, dan akhirnya kami menyadari bahwa TestNG tidak memiliki 'fitur mematikan'. Ini bagus, dan memiliki beberapa fitur yang tidak dimiliki JUnit 4, tetapi kami tidak membutuhkannya.
Kami tidak ingin orang merasa tidak nyaman menulis tes sambil mengenal TestNG karena kami ingin mereka terus menulis banyak tes.
Selain itu, JUnit merupakan standar de-facto di dunia Java. Tidak ada alat yang layak yang tidak mendukungnya dari kotak, Anda dapat menemukan banyak bantuan di web dan mereka menambahkan banyak fitur baru di tahun lalu yang menunjukkan bahwa itu hidup.

Kami memutuskan untuk tetap menggunakan JUnit dan tidak pernah melihat ke belakang.


IMHO, fitur pembunuh TestNG adalah kemampuan untuk menyampaikan argumen konteks melalui metode pengaturan Sebelum dan Sesudah. Kamu bisa melakukan banyak trik sulap rapi di sana yang tidak bisa dilakukan Junit. 95% orang tidak mau repot-repot mempelajari TestNG dengan baik dan mengabaikannya. Selain itu, TestNG memiliki cara penguliran yang rapi melalui DataProvider, tetapi hanya jika Anda memanfaatkannya. Selain itu, testng.xml dapat berisi Beanshell.
djangofan

17

Salam untuk semua yang di atas. Beberapa hal lain yang secara pribadi saya temukan lebih saya sukai di TestNG adalah:

  1. The @BeforeClassuntuk TestNG terjadi setelah penciptaan kelas, sehingga Anda tidak dibatasi oleh hanya mampu memanggil metode statis kelas Anda di dalamnya.

  2. Tes paralel dan berparameter, mungkin hidup saya tidak cukup ... tapi saya baru saja menulis satu set tes Selenium, menerima nama driver sebagai parameter. Kemudian tentukan 3 grup pengujian paralel, masing-masing 1 untuk pembalap IE, FF dan Chrome, dan tonton balapannya! Saya awalnya melakukan 4, tetapi terlalu banyak halaman yang saya kerjakan merusak HtmlUnitdriver karena satu dan lain alasan.

Ya, mungkin perlu menemukan kehidupan itu. ;)


akhirnya beberapa komentar gemuk setelah semua ummm mereka berdua sama .. dan awwhing
pengguna2412398

Ya, aturan TestNG: Saya memuat instance driver melalui argumen pengujian dari TestNG DataProvider juga. inilah cara saya melakukannya: github.com/djangofan/yet-another-selenium-framework/blob/master/…
djangofan

10

Saya ingin membagikan yang saya temui hari ini. Saya menemukan pelari Parameterized built-in cukup kasar di Junit4 dibandingkan dengan TestNG (saya tahu setiap kerangka kerja memiliki kekuatannya tetapi tetap saja). Anotasi Junit4 @parameters dibatasi untuk satu set parameter. Saya mengalami masalah ini saat menguji perilaku yang valid dan tidak valid untuk fungsionalitas di kelas pengujian yang sama. Jadi publik pertama, metode beranotasi statis yang ditemukannya akan digunakan, tetapi dapat menemukannya dalam urutan apa pun. Hal ini menyebabkan kita tidak perlu menulis kelas yang berbeda. Namun TestNG menyediakan cara yang bersih untuk menyediakan berbagai jenis penyedia data untuk setiap metode. Jadi kita dapat menguji unit kode yang sama dengan cara yang valid dan tidak valid di kelas pengujian yang sama dengan menempatkan data yang valid / tidak valid secara terpisah. Saya akan pergi dengan TestNG.


7

Juga satu keuntungan lagi dari TestNG adalah mendukung pengujian paralel. Di era multicores kita, ini penting, menurut saya.

Saya juga menggunakan kedua kerangka kerja. Tetapi saya menggunakan hamcrest untuk pernyataan. Hamcrest memungkinkan Anda dengan mudah menulis metode assert Anda sendiri. Jadi, bukan

assertEquals(operation.getStatus(), Operation.Status.Active);

Kamu bisa menulis

assertThat(operation, isActive());

Itu memberi Anda kesempatan untuk menggunakan tingkat abstraksi yang lebih tinggi dalam pengujian Anda. Dan ini membuat pengujian Anda lebih kuat.


7

JUnit 4 Vs TestNG - Perbandingan oleh mkyong.com (diperbarui pada 2013).

Kesimpulan: Saya menyarankan untuk menggunakan TestNG sebagai kerangka pengujian unit inti untuk proyek Java, karena TestNG lebih maju dalam pengujian parameterisasi, pengujian ketergantungan dan pengujian suite (Konsep pengelompokan).

TestNG dimaksudkan untuk pengujian fungsional, tingkat tinggi, dan integrasi kompleks. Fleksibilitasnya sangat berguna dengan rangkaian pengujian yang besar.

Selain itu, TestNG juga mencakup seluruh fungsionalitas inti JUnit4 . Tidak ada alasan bagi saya untuk menggunakan JUnit lagi.

Secara sederhana, TestNG = JUnit + lebih banyak lagi. Jadi, mengapa berdebat? pergi dan ambil TestNG :-)

Anda dapat menemukan perbandingan yang lebih detail di sini .


5

Beberapa tambahan untuk balasan Mike Stone:

1) Hal yang paling sering saya gunakan untuk grup TestNG adalah ketika saya ingin menjalankan metode pengujian tunggal dalam rangkaian pengujian. Saya cukup menambahkan tes ini ke grup "phil" dan kemudian menjalankan grup ini. Ketika saya menggunakan JUnit 3, saya akan mengomentari entri untuk semua metode kecuali yang saya ingin jalankan di metode "suite", tetapi kemudian biasanya lupa untuk menghapus komentar mereka sebelum check in. Dengan kelompok, saya tidak lagi memiliki masalah ini.

2) Bergantung pada kompleksitas pengujian, migrasi pengujian dari JUnit3 ke TestNG dapat dilakukan secara otomatis dengan sed dan membuat kelas dasar untuk menggantikan TestCase yang mengimpor statis semua metode pernyataan TestNG.

Saya memiliki info tentang migrasi saya dari JUnit ke TestNG di sini dan di sini .


masalah dengan memeriksa perubahan yang tidak Anda inginkan sebenarnya karena Anda harus meninjau apa yang Anda check in. Dan jika Anda memiliki check-in yang besar, itu bukan alasan, itu masalah lain: Anda harus memiliki banyak check-in yang lebih kecil.
hidralisk

5

Mengapa kami menggunakan TestNG, bukan JUnit?

  1. Deklarasi @BeforeClassdan @AfterClassmetode harus statis di JUnit sedangkan, ada lebih banyak fleksibilitas di TestNG dalam deklarasi metode, ia tidak memiliki batasan ini.

  2. Di TestNG, kita dapat melakukan parametrize tes menggunakan 2 cara . Anotasi @Parameter atau @DataProvider.

    i) @Parameter untuk kasus sederhana, yang memerlukan pemetaan nilai kunci. (data disediakan melalui file xml)

    ii) @DataProvider untuk kasus yang kompleks. Menggunakan array 2 dimensi, Ini dapat menyediakan data.

  3. Di TestNG, karena metode @DataProvider tidak perlu statis, kita dapat menggunakan beberapa metode penyedia data dalam kelas pengujian yang sama.

  4. Pengujian Ketergantungan: Di TestNG, jika pengujian awal gagal, maka semua pengujian dependen berikutnya akan dilewati, tidak ditandai sebagai gagal. Tapi JUnit menandainya gagal.

  5. Pengelompokan: Pengujian tunggal dapat dimiliki oleh beberapa grup dan kemudian dijalankan dalam konteks yang berbeda (seperti pengujian lambat atau cepat). Fitur serupa ada di Kategori JUnit tetapi tidak memiliki anotasi @BeforeGroups / @AfterGroups TestNG yang memungkinkan inisialisasi pengujian / penghancurannya.

  6. Paralelisme: Jika Anda ingin menjalankan pengujian yang sama secara paralel pada beberapa utas, TestNG telah membantu Anda dengan anotasi yang mudah digunakan sementara JUnit tidak menawarkan cara sederhana untuk melakukannya di luar kotak.

  7. TestNG @DataProvider juga dapat mendukung XML untuk memasukkan data, CSV, atau bahkan file teks biasa.

  8. TestNG memungkinkan Anda mendeklarasikan dependensi antar pengujian, dan melewatinya jika pengujian dependensi tidak berhasil.

@Test (dependOnMethods = {"dependOnSomething"})

Fungsi ini tidak ada di JUnit

  1. Pelaporan:

Laporan TestNG dibuat secara default ke folder keluaran pengujian yang menyertakan laporan HTML dengan semua data pengujian, lulus / gagal / dilewati, berapa lama mereka berjalan, masukan mana yang digunakan dan log pengujian lengkap. Selain itu, ini juga mengekspor semuanya ke file XML yang bisa digunakan untuk membuat template laporan Anda sendiri.

Di bagian depan JUnit, semua data ini juga tersedia melalui XML, tetapi tidak ada laporan out of the box dan Anda harus mengandalkan plugin.

Tautan Sumber Daya:

  1. Perbandingan JUnit vs TestNG Cepat
  2. JUnit vs. TestNG: Framework Pengujian Mana Yang Harus Anda Pilih?

Perbedaan yang baik diberikan dalam tutorial ini secara berdampingan: TestNG Vs JUnit: Apa Perbedaannya?


Anda tidak mencantumkan fitur TestNG yang paling berbeda, IHMO: kemampuan untuk meneruskan argumen konteks ke dalam metode Sebelum dan Sesudah, yang memungkinkan Anda melakukan sihir. DataProvider bekerja dengan cara ini, sebagai contoh.
djangofan

3

Pertanyaan Anda tampaknya dua kali lipat bagi saya. Di satu sisi Anda ingin membandingkan dua kerangka kerja pengujian, di sisi lain Anda ingin menerapkan tes dengan mudah, memiliki pernyataan alami, dll ...

Ok, pertama JUnit telah bermain mengejar ketinggalan dengan TestNG dalam hal fungsionalitas, mereka telah menjembatani kesenjangan beberapa apa dengan v4, tetapi menurut saya tidak cukup baik. Hal-hal seperti anotasi dan penyedia data masih jauh lebih baik di TestNG. Mereka juga lebih fleksibel dalam hal eksekusi uji, karena TestNG memiliki ketergantungan, pengelompokan, dan pengurutan uji.

JUnit masih memerlukan metode tertentu sebelum / sesudah menjadi statis, yang membatasi apa yang dapat Anda lakukan sebelum menjalankan pengujian, TestNG tidak pernah mengalami masalah ini.

TBH, sebagian besar perbedaan antara kedua kerangka tidak berarti banyak, kecuali jika Anda berfokus pada pengujian integrasi / otomatisasi. JUnit dari pengalaman saya dibangun dari bawah ke atas untuk pengujian unit dan sekarang didorong ke tingkat pengujian yang lebih tinggi, yang menurut IMO menjadikannya alat yang salah untuk pekerjaan itu. TestNG bekerja dengan baik pada pengujian unit dan karena penyediaan data yang kuat dan kemampuan eksekusi pengujian yang hebat, bekerja lebih baik pada tingkat pengujian integrasi / otomatisasi.

Sekarang untuk apa yang saya yakini adalah masalah terpisah, bagaimana menulis tes yang terstruktur dengan baik, dapat dibaca dan dipelihara. Sebagian besar dari ini saya yakin Anda tahu, tetapi hal-hal seperti Pola Pabrik , Pola Perintah , dan PageObjects (jika situs pengujian Anda) sangat penting, sangat penting untuk memiliki lapisan abstraksi antara apa pengujian Anda (SUT) dan apa pengujian yang sebenarnya. adalah (pernyataan logika bisnis). Untuk mendapatkan pernyataan yang jauh lebih bagus, Anda dapat menggunakan Hamcrest . Memanfaatkan javas inheritance / interfaces untuk mengurangi pengulangan dan menegakkan kesamaan.

Hampir lupa, gunakan juga Test Data Builder Pattern , ini digabungkan dengan anotasi penyedia data TestNG sangat berguna.


3

Pendapat saya tentang apa yang membuat TestNG benar-benar jauh lebih kuat:

1.  JUnit still requires the before/after class methods to be static, which limits
    what you can do prior to the running of tests, TestNG never has this issue.

2.  TestNG @Configuration methods can all take an optional argument to their 
    annotated methods in the form of a ITestResult, XmlTest, Method, or 
    ITestContext.  This allows you to pass things around that JUnit wouldn't 
    provide you.  JUnit only does this in listeners and it is limited in use.

3.  TestNG comes with some pre-made report generation classes that you can copy
     and edit and make into your own beautiful test output with very little 
     effort. Just copy the report class into your project and add a listener 
     to run it.  Also, ReportNG is available.

4.  TestNG has a handful of nice listeners that you can hook onto so you can do
     additional AOP style magic at certain phases during testing.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.