Saya telah membuat sistem web menggunakan Java Servlets dan sekarang ingin melakukan pengujian JUnit. Saya dataManager
hanyalah sepotong kode dasar yang mengirimkannya ke database. Bagaimana Anda menguji Servlet dengan JUnit?
Contoh kode saya yang memungkinkan pengguna untuk mendaftar / mendaftar, yang dikirimkan dari halaman utama saya melalui AJAX:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
unit-testing
testing
servlets
junit
Lunar
sumber
sumber
Pertama, dalam aplikasi nyata, Anda tidak akan pernah mendapatkan info koneksi database dalam servlet; Anda akan mengonfigurasinya di server aplikasi Anda.
Namun, ada cara untuk menguji Servlet tanpa menjalankan penampung. Salah satunya adalah dengan menggunakan objek tiruan. Spring menyediakan serangkaian tiruan yang sangat berguna untuk hal-hal seperti HttpServletRequest, HttpServletResponse, HttpServletSession, dll:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html
Dengan menggunakan tiruan ini, Anda dapat menguji hal-hal seperti
Apa yang terjadi jika nama pengguna tidak ada dalam permintaan?
Apa yang terjadi jika nama pengguna ada dalam permintaan?
dll
Anda kemudian dapat melakukan hal-hal seperti:
sumber
Saya menemukan pengujian Selenium lebih berguna dengan pengujian integrasi atau fungsional (end-to-end). Saya bekerja dengan mencoba menggunakan org.springframework.mock.web , tetapi saya tidak terlalu jauh. Saya memasang pengontrol sampel dengan rangkaian pengujian jMock .
Pertama, Pengendali:
Selanjutnya, tesnya:
Saya harap ini bisa membantu.
sumber
Diperbarui Feb 2018: OpenBrace Limited telah ditutup , dan produk ObMimic-nya tidak lagi didukung.
Berikut alternatif lain, menggunakan pustaka ObMimic dari Servlet API test-doubles OpenBrace (pengungkapan: Saya pengembangnya).
Catatan:
Setiap "mimic" memiliki objek "mimicState" untuk status logisnya. Ini memberikan perbedaan yang jelas antara metode API Servlet dan konfigurasi serta pemeriksaan status internal mimic.
Anda mungkin terkejut bahwa pemeriksaan Jenis Konten menyertakan "charset = ISO-8859-1". Namun, untuk kode "doPost" yang diberikan, ini sesuai dengan Servlet API Javadoc, dan metode getContentType HttpServletResponse sendiri, dan header Jenis Konten sebenarnya yang dihasilkan misalnya pada Glassfish 3. Anda mungkin tidak menyadari hal ini jika menggunakan objek tiruan normal dan ekspektasi sendiri dari perilaku API. Dalam hal ini mungkin tidak masalah, tetapi dalam kasus yang lebih kompleks ini adalah jenis perilaku API yang tidak terduga yang dapat membuat sedikit ejekan!
Saya telah menggunakan
response.getMimicState().getContentType()
cara termudah untuk memeriksa Jenis-Konten dan mengilustrasikan poin di atas, tetapi Anda memang dapat memeriksa "teks / html" sendiri jika Anda ingin (menggunakanresponse.getMimicState().getContentTypeMimeType()
). Memeriksa header Content-Type dengan cara yang sama seperti untuk header Cache-Control juga berfungsi.Untuk contoh ini konten respons diperiksa sebagai data karakter (dengan ini menggunakan pengkodean Penulis). Kami juga dapat memeriksa bahwa Writer respons digunakan daripada OutputStream-nya (menggunakan
response.getMimicState().isWritingCharacterContent()
), tetapi saya menganggap bahwa kami hanya mementingkan output yang dihasilkan, dan tidak peduli panggilan API apa yang menghasilkannya (meskipun itu bisa jadi diperiksa juga ...). Ini juga memungkinkan untuk mengambil konten tubuh respons sebagai byte, memeriksa status detail Writer / OutputStream, dll.Ada rincian lengkap tentang ObMimic dan unduhan gratis di situs web OpenBrace . Atau Anda dapat menghubungi saya jika Anda memiliki pertanyaan (detail kontak ada di situs web).
sumber
EDIT : Cactus sekarang menjadi proyek mati: http://attic.apache.org/projects/jakarta-cactus.html
Anda mungkin ingin melihat kaktus.
http://jakarta.apache.org/cactus/
sumber
Pendekatan lain adalah membuat server tertanam untuk "menghosting" servlet Anda, memungkinkan Anda untuk menulis panggilan padanya dengan pustaka yang dimaksudkan untuk membuat panggilan ke server sebenarnya (kegunaan dari pendekatan ini agak tergantung pada seberapa mudah Anda dapat membuat "sah" programatik panggilan ke server - Saya sedang menguji titik akses JMS (Java Messaging Service), yang banyak kliennya).
Ada beberapa rute berbeda yang dapat Anda lalui - dua yang biasa adalah tomcat dan jetty.
Peringatan: sesuatu yang harus diperhatikan saat memilih server untuk disematkan adalah versi servlet-api yang Anda gunakan (pustaka yang menyediakan kelas seperti HttpServletRequest). Jika Anda menggunakan 2.5, saya menemukan Jetty 6.x berfungsi dengan baik (contoh yang akan saya berikan di bawah). Jika Anda menggunakan servlet-api 3.0, tomcat-7 yang disematkan tampaknya merupakan pilihan yang baik, namun saya harus mengabaikan upaya saya untuk menggunakannya, karena aplikasi yang saya uji menggunakan servlet-api 2.5. Mencoba mencampur keduanya akan menghasilkan NoSuchMethod dan pengecualian serupa lainnya saat mencoba mengonfigurasi atau memulai server.
Anda dapat mengatur server seperti ini (Jetty 6.1.26, servlet-api 2.5):
sumber
Gunakan Selenium untuk pengujian unit berbasis web. Ada plugin Firefox bernama Selenium IDE yang dapat merekam tindakan di halaman web dan mengekspor ke kasus pengujian JUnit yang menggunakan Selenium RC untuk menjalankan server pengujian.
sumber
sumber
Pertama, Anda mungkin harus merefaktor ini sedikit sehingga DataManager tidak dibuat dalam kode doPost .. Anda harus mencoba Injeksi Ketergantungan untuk mendapatkan sebuah instance. (Lihat video Guice untuk pengantar yang bagus tentang DI.). Jika Anda diberi tahu untuk memulai pengujian unit semuanya, maka DI harus dimiliki.
Setelah dependensi Anda dimasukkan, Anda dapat menguji kelas Anda secara terpisah.
Untuk benar-benar menguji servlet, ada utas lama lainnya yang telah membahas ini .. coba di sini dan di sini .
sumber