Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Testing
Code

Unit Testing Singkat: Visual Studio

by
Length:LongLanguages:
This post is part of a series called Unit Testing Succinctly.
Unit Testing Succinctly: Testing Basics
Unit Testing Succinctly: NUnit

Indonesian (Bahasa Indonesia) translation by Yusuf Samin (you can also view the original English article)

Ini adalah kutipan dari eBook Unit Testing ringkas, oleh Marc Clifton, disediakan oleh Syncfusion.

Unit test terdiri dari dua hal:

  • Kelas yang mewakili test fixture.
  • Metode di kelas mewakili unit test.

Visual Studio akan secara otomatis membuat stub untuk proyek uji, yang merupakan tempat kita akan mulai.

Membuat Proyek Unit Test di Visual Studio

Unit test biasanya ditempatkan dalam proyek terpisah (menghasilkan assembly berbeda) dari kode aplikasi Anda. Dalam Visual Studio 2008 atau 2012, Anda dapat membuat proyek uji unit dengan mengklik kanan pada solusi dan memilih Add diikuti oleh New Project dari menu pop-up:

Adding a New Project
Menambahkan sebuah proyek baru

Dari kotak dialog yang muncul, pilih proyek Test:

VS2008 New Test Project
VS2008 Proyek Tes Baru
VS2012 New Test Project
VS2012 Proyek Tes Baru

Visual Studio 2008 akan membuat file stub, "UnitTest1.cs" (jika Anda memilih bahasa C #), dengan berbagai komentar bermanfaat di stub. Visual Studio 2012 membuat stub yang jauh lebih terser:

Untuk Pengguna Visual Studio 2008

Visual Studio 2008 juga akan membuat kelas TestContext — ini tidak lagi ada di VS2012 dan kami akan mengabaikannya — gunakan rintisan sebelumnya dari VS2012 sebagai gantinya.

Juga, hapus file "ManualTest1.mht", jika tidak, Anda akan diminta untuk memilih hasil pengujian dan memasukkan catatan pengujian secara manual.

Tes Fixture

Perhatikan bahwa kelas didekorasi dengan atribut TestClass. Ini mendefinisikan tes fixture — kumpulan metode pengujian.

Metode tes

Perhatikan bahwa metode ini didekorasi dengan atribut TestMethod. Ini mendefinisikan metode, yang akan menjalankan uji fixture.


Kelas Assert

Kelas assert mendefinisikan metode statis berikut yang dapat digunakan untuk memverifikasi perhitungan metode:

  • AreEqual/AreNotEqual
  • AreSame/AreNotSame
  • IsTrue/IsFalse
  • IsNull/IsNotNull
  • IsInstanceOfType/IsNotInstanceOfType

Banyak assertion ini kelebihan beban dan disarankan agar Anda meninjau dokumentasi lengkap yang disediakan Microsoft.

Dasar-dasar Membuat Assertion

Perhatikan bahwa contoh-contoh berikut menggunakan VS2008.

Assertion adalah tulang punggung dari setiap tes. Ada berbagai pernyataan yang dapat dibuat tentang hasil tes. Untuk mulai dengan, kami akan menulis pernyataan sederhana yang menyatakan "satu sama dengan satu," dengan kata lain, disangkal:

Jalankan tes, yang akan menghasilkan "Passed":

Simple Assertion
Assertion Sederhana

AreEqual/AreNotEqual

Metode AreEqual dan AreNotEqual membandingkan:

  • objek
  • double
  • Single
  • string
  • data typed

Mereka mengambil bentuk membandingkan nilai yang diharapkan (parameter pertama) dengan nilai aktual (parameter kedua). Berkenaan dengan nilai-nilai tunggal dan ganda, "dalam akurasi tertentu" dapat ditentukan. Terakhir, semua overloads memiliki opsi untuk menampilkan pesan (diformat secara opsional) jika assertion gagal.

Berkenaan dengan kesetaraan objek, metode ini membandingkan apakah instance identik:

Tes sebelumnya sukses, karena objek1 dan objek2 tidak sama. Namun, jika kelas mengabaikan metode Equals, maka kesetaraan didasarkan pada perbandingan yang dibuat oleh metode Equals yang diterapkan di kelas. Sebagai contoh:

AreSame/AreNotSame

Kedua metode ini memverifikasi bahwa instancenya sama (atau tidak). Sebagai contoh:

Meskipun kelas AnObject menimpa operator Equals, tes sebelumnya berlalu karena instance dari dua objek tidak sama.

IsTrue/IsFalse

Dua metode ini memungkinkan Anda untuk menguji kebenaran perbandingan nilai. Dari perspektif keterbacaan, metode IsTrue dan IsFalse biasanya digunakan untuk perbandingan nilai, sedangkan AreEqual dan AreSame biasanya digunakan untuk membandingkan instance (objek).

Sebagai contoh:

Ini memverifikasi nilai properti itu.

IsNull/IsNotNull

Dua tes ini memverifikasi apakah suatu objek null atau tidak:

IsInstanceOfType/IsNotInstanceOfType

Dua metode ini memverifikasi bahwa suatu objek adalah turunan dari tipe tertentu (atau tidak). Sebagai contoh:

Inconclusive

Metode Assert.Inconclusive dapat digunakan untuk menentukan bahwa tes atau fungsionalitas di balik tes belum dilaksanakan dan oleh karena itu tes ini tidak meyakinkan.

Apa Yang Terjadi Ketika Suatu Assertion Gagal?

Berkenaan dengan pengujian unit Visual Studio, ketika pernyataan gagal, metode menegaskan melemparkan AssertFailedException. Exception ini seharusnya tidak pernah ditangani oleh kode pengujian Anda.


Kelas Assertion Lainnya

Ada dua kelas assertion lain:

  • CollectionAssert
  • StringAssert

Seperti namanya, pernyataan ini beroperasi pada koleksi dan string, masing-masing.

Assertion Koleksi

Metode ini diterapkan di Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert kelas. Perhatikan bahwa parameter pengumpulan dalam metode ini mengharapkan pengumpulan untuk mengimplementasikan ICollection (kontras dengan NUnit, yang mengharapkan IEnumerable).

AllItemsAreInstanceOfType

Assertion ini memverifikasi bahwa objek dalam koleksi memiliki tipe yang sama, yang mencakup tipe turunan dari tipe yang diharapkan, seperti yang diilustrasikan di sini:

AllItemsAreNotNull

Assertion ini memverifikasi bahwa objek dalam koleksi tidak null.

AllItemsAreUnique

Tes ini memastikan bahwa objek dalam koleksi adalah unik. Jika membandingkan struktur:

struktur dibandingkan dengan nilai, bukan dengan instance — tes sebelumnya gagal. Namun, bahkan jika kelas mengabaikan metode Equals:

tes ini lolos:

AreEqual/AreNotEqual

Tes ini menyatakan bahwa dua koleksi sama. Metode mencakup overloads yang memungkinkan Anda memberikan metode pembanding. Jika suatu objek menimpa metode Persamaan, metode itu akan digunakan untuk menentukan kesetaraan. Sebagai contoh:

Kedua koleksi ini sama karena kelas AnObject menimpa metode Equals (lihat contoh sebelumnya).

Perhatikan bahwa untuk meneruskan assertion, daftar harus memiliki panjang yang sama dan dianggap tidak sama jika daftar tersebut identik kecuali dalam urutan yang berbeda. Bandingkan ini dengan pernyataan AreEquivalent yang dijelaskan selanjutnya.

AreEquivalent/AreNotEquivalent

Assertion ini membandingkan dua daftar dan menganggap daftar item yang sama untuk menjadi setara terlepas dari pesanan. Sayangnya, tampaknya ada bug dalam implementasi, karena tes ini gagal:

Visual Studios AreEquivalent Bug
AreEquivalent Bug Visual Studio

dengan pesan kesalahan:

Sedangkan implementasi NUnit atas pernyataan ini lolos:

NUnits AreEquivalent Works Correctly
AreUquivalent NUnit Bekerja dengan Benar

Contains/DoesNotContain

Assertion ini memverifikasi bahwa objek terkandung dalam koleksi:

menggunakan metode Equals (jika diganti) untuk melakukan tes kesetaraan.

IsSubsetOf/IsNotSubsetOf

Assertion ini memverifikasi bahwa parameter pertama (subset) terkandung dalam koleksi parameter kedua (superset).

Perhatikan bahwa tes subset tidak menguji urutan atau rangkaian — itu hanya menguji apakah item dalam daftar subset terkandung dalam superset.

Assertion String

Metode ini diimplementasikan di Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert kelas:

  • Contains
  • Matches/DoesNotMatch
  • StartsWith/EndsWith

Ini dibahas berikutnya.

Contains

Metode Contains menegaskan bahwa subset (perhatikan bahwa ini adalah parameter kedua) terkandung dalam string (parameter pertama). Misalnya, tes ini lolos:

Matches/DoesNotMatch

Metode ini menegaskan bahwa string (parameter pertama) cocok dengan pola regex yang disediakan pada parameter kedua.

StartsWith/EndsWith

Metode ini menegaskan bahwa string (parameter pertama) dimulai dengan atau diakhiri dengan string lain (parameter kedua).


Exception

Exception dapat diuji tanpa menulis blok try-catch di sekitar metode pengujian. Misalnya, selagi Anda bisa menulis ini:

Jauh lebih mudah dibaca untuk menggunakan atribut ExpectedException pada metode pengujian:


Atribut berguna lainnya

Ada beberapa atribut tambahan yang berguna untuk menjalankan serangkaian tes serta tes individual yang meningkatkan usabilitas dan keterbacaan basis kode unit tes.

Setup/Teardown

Engine Unit Tes Visual Studio menyediakan empat atribut metode tambahan:

  • ClassInitialize
  • ClassCleanup
  • TestInitialize
  • TestCleanup

Atribut ini mendahului dan mengikuti eksekusi semua tes dalam fixture (kelas), serta sebelum dan sesudah setiap tes dalam fixture.

Perhatikan bahwa metode yang didekorasi dengan atribut ini harus statis.

ClassInitialize

Jika suatu metode didekorasi dengan atribut ini, kode dalam metode ini dieksekusi sebelum menjalankan semua tes dalam fixture. Perhatikan bahwa metode ini memerlukan parameter TestContext.

Metode ini berguna untuk mengalokasikan sumber daya atau instantiate kelas yang diandalkan oleh semua tes dalam fixture. Pertimbangan penting dengan sumber daya dan objek yang dibuat selama inisialisasi fixture adalah bahwa sumber daya dan objek ini harus dianggap read-only. Tes tidak disarankan untuk mengubah keadaan sumber daya dan objek yang menjadi dasar tes lainnya. Ini termasuk koneksi ke layanan seperti basis data dan layanan web yang koneksinya mungkin tidak valid karena kesalahan dalam suatu tes, sehingga membatalkan semua tes lainnya. Selanjutnya, urutan menjalankan tes tidak dijamin. Mengubah keadaan sumber daya dan objek yang dibuat dalam inisialisasi fixture dapat mengakibatkan efek samping, tergantung pada urutan tes dijalankan.

ClassCleanup

Metode yang didekorasi dengan atribut ini bertanggung jawab untuk tidak mengalokasikan sumber daya, menutup koneksi, dll., Yang dibuat selama inisialisasi kelas. Metode ini akan selalu dijalankan setelah menjalankan tes di dalam fixture, terlepas dari keberhasilan atau kegagalan tes itu sendiri.

TestInitialize

Mirip dengan atribut ClassInitialize, metode yang didekorasi dengan atribut ini akan dieksekusi untuk setiap tes sebelum menjalankan tes. Salah satu tujuan dari atribut ini adalah untuk memastikan bahwa sumber daya atau objek yang dialokasikan oleh kode ClassInitialize diinisialisasi ke kondisi yang diketahui sebelum menjalankan setiap tes.

TestCleanup

Melengkapi atribut TestInitialize, metode yang didekorasi dengan TestCleanup akan dieksekusi pada penyelesaian setiap tes.

Setup dan aliran Teardown

Kode berikut menunjukkan aliran fixture dan pengaturan tes dan teardown sehubungan dengan tes yang sebenarnya:

Jalankan fixture ini menghasilkan jejak output debug berikut:

Seperti yang diilustrasikan dalam contoh sebelumnya, fixture diinisialisasi — kemudian untuk setiap tes, setup tes dan kode teardown dijalankan, diikuti oleh fixture teardown di akhir.


Atribut yang jarang digunakan

Bagian berikut menjelaskan atribut yang jarang digunakan.

AssemblyInitialize/AssemblyCleanup

Metode yang didekorasi dengan atribut ini harus statis dan dieksekusi ketika perakitan dimuat. Ini menimbulkan pertanyaan — bagaimana jika majelis memiliki lebih dari satu tes fixture?

Jika Anda mencoba ini, tes engine gagal menjalankan unit tes apa pun, melaporkan:

"UTA013: UnitTestExamplesVS2008.Fixture2: Tidak dapat mendefinisikan lebih dari satu metode dengan atribut AssemblyInitialize di dalam sebuah assembly."

Oleh karena itu, hanya satu AssemblyInitialize dan satu metode AssemblyCleanup dapat ada untuk sebuah assembly, terlepas dari jumlah perlengkapan pengujian dalam perakitan itu. Oleh karena itu disarankan agar tidak ada tes yang sebenarnya dimasukkan ke dalam kelas yang mendefinisikan metode ini:

menghasilkan urutan eksekusi berikut:

Perhatikan assembly tambahan memulai dan membersihkan panggilan.

Mengabaikan

Metode ini dapat menghiasi metode tertentu atau seluruh fixture.

Abaikan Metode Tes

Jika atribut ini menghiasi metode pengujian:

tes tidak akan berjalan. Sayangnya, panel Hasil Tes Visual Studio tidak menunjukkan bahwa ada tes yang saat ini diabaikan:

Ignored Tests Are Not Shown
Tes yang Diabaikan Tidak Ditampilkan

Bandingkan ini dengan NUnit, yang dengan jelas menunjukkan tes yang diabaikan:

NUnit Shows Ignored Tests
NUnit Menunjukkan Tes yang Diabaikan

Tampilan NUnit menandai seluruh pohon tes sebagai "unknown" ketika satu atau lebih metode pengujian ditandai sebagai "Ignore."

Abaikan Fixture Tes

Seluruh metode fixture dapat diabaikan dengan menggunakan atribut Ignore  di tingkat kelas:

Menghapus Cache Tes

Jika Anda menambahkan atribut Ignore ke metode, Anda mungkin memperhatikan bahwa Visual Studio masih menjalankan tes. Penting untuk menghapus cache tes untuk Visual Studio untuk mengambil perubahan. Salah satu cara untuk melakukan ini adalah membersihkan solution dan membangunnya kembali.

Pemilik

Digunakan untuk tujuan pelaporan, atribut ini menggambarkan orang yang bertanggung jawab untuk metode unit tes.

DeploymentItem

Jika unit tes dijalankan dalam folder deployment yang terpisah, atribut ini dapat digunakan untuk menentukan file yang diperlukan oleh kelas uji atau metode pengujian untuk dapat dijalankan. Anda dapat menentukan file atau folder untuk disalin ke folder deployment dan secara opsional menentukan jalur target relatif ke folder deployment.

Deskripsi

Digunakan untuk pelaporan, atribut ini memberikan deskripsi metode pengujian. Anehnya, atribut ini hanya tersedia pada metode pengujian dan tidak tersedia pada kelas tes.

HostType

Untuk metode pengujian, atribut ini digunakan untuk menentukan host tempat tes unit akan dijalankan.

Prioritas

Atribut ini tidak digunakan oleh tes engine, tetapi dapat digunakan, melalui refleksi, oleh kode pengujian Anda sendiri. Kegunaan atribut ini dipertanyakan.

WorkItem

Jika Anda menggunakan Team Foundation Server (TFS), Anda dapat menggunakan atribut ini pada metode pengujian untuk menentukan ID item kerja yang ditugaskan oleh TFS ke unit tes khusus.

CssIteration/CssProjectStructure

Dua atribut ini digunakan dalam hubungan dengan TeamBuild dan TestManagementService dan memungkinkan Anda untuk menentukan iterasi proyek yang sesuai dengan metode tes


Pengujian Parameterisasi dengan Atribut DataSource

Unit test engine Microsoft mendukung sumber data CSV, XML, atau database untuk pengujian parameter. Ini tidak sepenuhnya benar pengujian parameterisasi (lihat bagaimana NUnit mengimplementasikan pengujian parameterisasi) karena parameter tidak diteruskan ke metode unit test tetapi harus diekstraksi dari sumber data dan diteruskan ke metode yang sedang diuji. Namun, kemampuan untuk memuat data test ke dalam DataTable dari berbagai sumber sangat membantu untuk mengarahkan otomasi pengujian.

Sumber Data CSV

File teks yang dipisahkan koma-nilai dapat digunakan untuk sumber data:

dan digunakan dalam metode pengujian:

Ini menghasilkan output berikut:

Perhatikan bahwa jendela hasil tes tidak menunjukkan parameter berjalan (kontras ini dengan NUnit):

Parameterized Test Results
Hasil Uji Parameterisasi

Namun, ada keuntungan jelas untuk tidak menampilkan setiap kombinasi tes, terutama untuk kumpulan data besar.

Sumber Data XML

Berikan file XML seperti:

contoh menggunakan sumber data XML untuk unit test adalah:

Perhatikan bahwa selain parameter atribut sumber data, kode pengujiannya sama.

Sumber Data Basis Data

Tabel database juga dapat digunakan sebagai sumber data. Diberikan tabel seperti:

Database Table as a Data Source
Tabel Database sebagai Sumber Data

dan data:

Database Test Data
Data Tes Basis Data

Contoh metode tes menggunakan data ini terlihat seperti:

Sekali lagi, perhatikan bahwa kode metode pengujian itu sendiri sama — satu-satunya hal yang kami lakukan di sini adalah mengubah definisi DataSource.

Atribut TestProperty

Dokumentasi MSDN untuk atribut ini menggambarkan mendeklarasikan pasangan nilai-nama TestProperty dan kemudian, menggunakan refleksi, memperoleh nama dan nilai. Ini tampaknya menjadi cara tumpul untuk membuat tes parameter.

Selanjutnya, kode, yang dijelaskan di blog Craig Andera, untuk menggunakan atribut TestProperty untuk parameter proses inisialisasi tes tidak mempengaruhi koleksi TestContext.Properties pada Visual Studio 2008 atau Visual Studio 2012.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.