Cara menyiapkan pengujian unit untuk Visual Studio C ++

93

Saya mengalami masalah dalam mencari tahu cara menyiapkan kerangka pengujian dan dapat digunakan dalam Visual Studio 2008 karena C++mungkin dengan rangkaian pengujian unit bawaan.

Tautan atau tutorial apa pun akan dihargai.

DShook
sumber
Google merilis C ++ Test Framework yang sangat mirip dengan framework xUnit. http://code.google.com/p/googletest/
popopome
Kerangka apa yang akhirnya Anda gunakan?
Joakim Karlsson
sebenarnya saya masih belum menggunakan satupun dari mereka. Saya memutuskan bahwa apa yang saya kerjakan pada tes unit bukanlah penggunaan waktu yang paling efektif.
DShook

Jawaban:

56

Halaman ini mungkin membantu, mengulas beberapa kerangka kerja pengujian unit C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unit ++
  • CxxTest

Lihat CPPUnitLite atau CPPUnitLite2 .

CPPUnitLite dibuat oleh Michael Feathers, yang awalnya mem-porting JUnit Java ke C ++ sebagai CPPUnit (CPPUnit mencoba meniru model pengembangan JUnit - tetapi C ++ kekurangan fitur Java [mis. Refleksi] agar mudah digunakan).

CPPUnitLite mencoba membuat kerangka kerja pengujian gaya C ++ yang sebenarnya, bukan kerangka kerja Java yang di-porting ke C ++. (Saya memparafrasekan dari buku Feather's Working Effectively with Legacy Code ). CPPUnitLite2 tampaknya merupakan penulisan ulang lainnya, dengan lebih banyak fitur dan perbaikan bug.

Saya juga baru saja menemukan UnitTest ++ yang menyertakan barang-barang dari CPPUnitLite2 dan beberapa kerangka kerja lainnya.

Microsoft telah merilis WinUnit .

Juga periksa Catch atau Doctest

tapir
sumber
2
Googletest sangat mirip dengan boost :: test tetapi sedikit lebih mudah diintegrasikan ke dalam VS
Martin Beckett
3
Saya terkejut Catch tidak disebutkan di sini. Juga periksa doctest - implementasi ulang Catch saya dengan fokus besar pada kecepatan kompilasi
periksa
1
@onqtam jangan terlalu kaget, tanya / jawab ini dari tahun 2008! Menambahkan tautan yang Anda sarankan.
Aardvark
24

Ada cara untuk menguji C ++ tidak terkelola menggunakan kerangka kerja pengujian bawaan dalam Visual Studio 2008 . Jika Anda membuat Proyek Uji C ++, menggunakan C ++ / CLI, Anda kemudian dapat melakukan panggilan ke DLL yang tidak dikelola. Anda harus mengganti dukungan Waktu Proses Bahasa Umum ke / clr dari / clr: safe jika Anda ingin menguji kode yang ditulis dalam C ++ yang tidak dikelola.

Saya memiliki detail langkah demi langkah di blog saya di sini: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

Jared
sumber
1
Ini menempatkan batasan tertentu pada kode C ++ Anda, saya punya setidaknya satu basis kode di mana mencoba memasukkan headernya ke dalam kode C ++ / CLI lebih merepotkan daripada nilainya. Manfaat besar bagi saya menggunakan C ++ / CLI adalah Anda dapat menggunakan pengujian parameterisasi yang funky dengan atribut seperti RowTest di mbUnit / NUnit / xUnit.Net
Andy Dent
9

Berikut adalah pendekatan yang saya gunakan untuk menguji modul IIS URL Rewrite di Microsoft (ini berbasis baris perintah, tetapi harus bekerja untuk VS juga):

  1. Pastikan file header Anda dapat dikonsumsi dengan memindahkan kode sumber ke file cpp dan menggunakan deklarasi penerusan jika diperlukan.
  2. Kompilasi kode Anda untuk diuji sebagai pustaka (.lib)
  3. Buat proyek UnitTest Anda sebagai C ++ dengan dukungan CLR.
  4. Sertakan file header Anda.
  5. Sertakan file .lib Anda.
  6. Tambahkan referensi ke Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Gunakan kelas yang sangat kecil untuk mendeklarasikan pengujian unit Anda dan lompat dari kode terkelola ke C ++ / Native seperti ini (mungkin ada kesalahan ketik):

Berikut ini contohnya:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

Dengan pendekatan ini, orang tidak perlu belajar terlalu banyak tentang C ++ / CLI, semua tes yang sebenarnya akan dilakukan dalam C ++ native dan kelas TestShim akan digunakan untuk 'mempublikasikan' tes ke MSTest.exe (atau membuatnya terlihat ).

Untuk menambahkan pengujian baru, Anda cukup mendeklarasikan metode [TestMethod] void NewTest () {:: NewTest ();} baru dan fungsi native void NewTest () baru. Tidak ada makro, tidak ada trik, lurus ke depan.

Sekarang, file heade bersifat opsional, tetapi dapat digunakan untuk mengekspos metode kelas Assert dengan tanda tangan asli C ++ (mis. Wchar_t * bukan Stirng ^), sehingga Anda dapat membuatnya tetap dekat dengan C ++ dan jauh dari C ++ / CLI :

Berikut ini contohnya:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH

aracntido
sumber
6

Secara pribadi, saya lebih suka WinUnit karena tidak mengharuskan saya menulis apa pun kecuali untuk pengujian saya (saya membangun .dll sebagai pengujian, bukan exe). Saya baru saja membangun sebuah proyek, dan mengarahkan WinUnit.exe ke direktori keluaran pengujian saya dan menjalankan semua yang ditemukannya. Anda dapat mengunduh proyek WinUnit di sini . (MSDN sekarang mengharuskan Anda untuk mengunduh seluruh masalah, bukan artikelnya. WinUnit disertakan di dalamnya.)

moswald
sumber
4

Kerangka yang disertakan dengan VS9 adalah .NET, tetapi Anda dapat menulis pengujian dalam C ++ / CLI, selama Anda merasa nyaman mempelajari beberapa isme .NET, Anda seharusnya dapat menguji sebagian besar kode C ++.

boost.test dan googletest terlihat cukup mirip, tetapi diadaptasi untuk penggunaan yang sedikit berbeda. Keduanya memiliki komponen biner, jadi Anda memerlukan proyek tambahan dalam solusi Anda untuk mengompilasi dan menjalankan pengujian.

Kerangka kerja yang kami gunakan adalah CxxTest , yang jauh lebih ringan; itu hanya header, dan menggunakan skrip Perl (!) untuk mengikis informasi rangkaian pengujian dari header Anda (suite mewarisi dari CxxTest :: Base, semua nama metode pengujian Anda dimulai dengan "test"). Jelas, ini mengharuskan Anda mendapatkan Perl dari satu sumber atau sumber lain , yang menambahkan overhead ke pengaturan lingkungan build Anda.

Ben Straub
sumber
CxxTest dapat menggunakan python sebagai pengganti perl
Martin Beckett
Anda juga perlu berhati-hati tentang DLL yang diperlukan oleh kode Anda - Saya mengalami masalah dengan NUnit dan mbUnit menguji kode C ++ / CLI, mencoba memuat DLL.
Andy Dent
2

Saya menggunakan UnitTest ++ .

Bertahun-tahun sejak saya membuat posting ini, sumber telah dipindahkan dari SourceForge ke github. Juga contoh tutorial sekarang lebih agnostik - tidak masuk ke konfigurasi atau pengaturan proyek sama sekali.

Saya ragu itu masih akan berfungsi untuk Visual Studio 6 karena file proyek sekarang dibuat melalui CMake. Jika Anda masih membutuhkan dukungan versi lama, Anda bisa mendapatkan versi terakhir yang tersedia di bawah cabang SourceForge .

graham.reeds
sumber
2

Alat yang telah disebutkan di sini adalah semua alat baris perintah. Jika Anda mencari solusi yang lebih terintegrasi, lihat cfix studio , yang merupakan AddIn Visual Studio untuk pengujian unit C / C ++. Ini sangat mirip dengan TestDriven.Net, tetapi untuk (tidak dikelola) C / C ++ daripada .NET.

Peter Mortensen
sumber
1

Saya telah menggunakan CppUnit dengan VS2005 dan Eclipse. Wiki sangat menyeluruh (terutama jika Anda sudah familiar dengan JUnit).

colgur
sumber
1

Saya tidak 100% yakin tentang VS2008, tetapi saya tahu bahwa kerangka kerja Unit Testing yang dikirimkan oleh Microsoft dalam VS2005 sebagai bagian dari Team Suite mereka hanya untuk .NET, bukan C ++

Saya telah menggunakan CppUnit juga dan tidak apa-apa. Sama seperti NUnit / JUnit / sebagainya.

Jika Anda telah menggunakan boost, mereka juga memiliki pustaka pengujian unit

Orang-orang di belakang peningkatan memiliki beberapa kode pengkodean yang serius , jadi saya akan mengatakan kerangka kerja mereka seharusnya cukup bagus, tetapi mungkin bukan yang paling ramah pengguna :-)

Orion Edwards
sumber
1

Saya menyukai CxxTest juga karena alasan yang sama. Ini hanya file header jadi tidak perlu menghubungkan. Anda tidak terjebak dengan Perl karena ada juga pelari Python. Saya akan segera meninjau perpustakaan google. Barang Boost menarik terlalu banyak bagasi lain.

ZebZiggle
sumber
1

Penguji unit untuk Visual Studio 2008 hanya untuk kode NET. Sejauh yang saya tahu.

Saya menggunakan CppUnit di Visual Studio 2005 dan ternyata cukup bagus.

Sejauh yang saya ingat, penyiapannya relatif tidak menyakitkan. Pastikan bahwa dalam proyek pengujian Anda, linker (Linker → Input → Ketergantungan Tambahan) menyertakan cppunitd.lib.

Lalu, #include <cppunit/extensions/HelperMacros.h>di header Anda.

Anda kemudian dapat mengikuti langkah-langkah di http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html agar kelas pengujian Anda berfungsi.

Lehane
sumber
1

Saya menderita untuk mengimplementasikan unit testing untuk aplikasi C ++ tidak terkelola di lingkungan Windows dengan Visual Studio. Jadi saya berhasil mengatasi dan menulis posting sebagai panduan langkah demi langkah untuk pengujian unit aplikasi C ++ yang tidak terkelola. Saya harap ini dapat membantu Anda.

Uji unit untuk C ++ tidak terkelola di Visual Studio

Nayana Adassuriya
sumber