Visual Studio C ++ için birim testi kurma


93

Test çerçevesini nasıl kurup Visual Studio 2008 için C++yerleşik birimin test paketi ile muhtemelen.

Herhangi bir bağlantı veya öğretici takdir edilecektir.


Google, xUnit çerçevelerine çok benzeyen C ++ Test Framework'ü yayınlar. http://code.google.com/p/googletest/
popopome

Hangi çerçeveyi kullandınız?
Joakim Karlsson

aslında hala hiçbirini kullanmadım. Birim testleri üzerinde çalıştığım şeyin zamanı en etkili şekilde kullanmadığına karar verdim.
DShook

Yanıtlar:


56

Bu sayfa yardımcı olabilir, epeyce C ++ birim testi çerçevesini gözden geçirir:

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

Check out CPPUnitLite veya CPPUnitLite2 .

CPPUnitLite , başlangıçta Java'nın JUnit'ini CPPUnit olarak C ++ 'ya taşıyan Michael Feathers tarafından yaratılmıştır (CPPUnit, JUnit'in geliştirme modelini taklit etmeye çalışır - ancak C ++, kullanımı kolaylaştırmak için Java'nın özelliklerinden [örneğin yansıma] yoksundur).

CPPUnitLite, C ++ 'ya taşınan bir Java değil, gerçek bir C ++ tarzı test çerçevesi oluşturmaya çalışır. (Feather'ın Eski Kodla Etkili Çalışma kitabından alıntı yapıyorum ). CPPUnitLite2 , daha fazla özellik ve hata düzeltmesi ile başka bir yeniden yazma gibi görünüyor.

Ayrıca , CPPUnitLite2 ve başka bir çerçeveden şeyler içeren UnitTest ++ 'ya rastladım.

Microsoft, WinUnit'i piyasaya sürdü .

Ayrıca Catch veya Doctest'e göz atın


2
Googletest, boost :: test'e çok benziyor ancak VS'ye entegre edilmesi biraz daha kolay
Martin Beckett

3
Burada Catch'den bahsedilmemesine şaşırdım . Ayrıca ödeme doctest - çıkış - derleme hızı üzerinde büyük odaklanarak Catch benim reimplementation SSS iki arasında farklı nedir görmek
onqtam

1
@onqtam çok şaşırmayın, bu soru / cevap 2008'dendi! Size önerilen bağlantıları ekledi.
Aardvark

24

Visual Studio 2008 içindeki yerleşik test çerçevesini kullanarak yönetilmeyen C ++ 'yı test etmenin bir yolu vardır . C ++ / CLI kullanarak bir C ++ Test Projesi oluşturursanız, yönetilmeyen bir DLL'ye çağrı yapabilirsiniz. Yönetilmeyen C ++ ile yazılmış kodu test etmek istiyorsanız, Ortak Dil Çalışma Zamanı desteğini / clr: safe konumundan / clr olarak değiştirmeniz gerekecektir.

Blogumda adım adım ayrıntılara sahibim: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
Bu, C ++ kodunuza belirli kısıtlamalar getiriyor, başlıklarını C ++ / CLI koduna dahil etmeye çalışmanın değerinden daha fazla sorun olduğu en az bir kod tabanım var. C ++ / CLI kullanmanın benim için en büyük yararı, mbUnit / NUnit / xUnit.Net'te RowTest gibi özelliklerle eğlenceli parametreleştirilmiş testi kullanabilmenizdir
Andy Dent

9

Microsoft'ta IIS URL Yeniden Yazma modülünü test etmek için kullandığım yaklaşım şu şekildedir (komut satırı tabanlıdır, ancak VS için de çalışmalıdır):

  1. Kaynak kodunu cpp dosyalarına taşıyarak ve gerekirse ileri bildirimi kullanarak başlık dosyalarınızın tüketilebilir olduğundan emin olun.
  2. Kitaplık (.lib) olarak test etmek için kodunuzu derleyin
  3. CLR desteği ile UnitTest projenizi C ++ olarak oluşturun.
  4. Başlık dosyalarınızı ekleyin.
  5. .Lib dosyalarınızı ekleyin.
  6. Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll için bir başvuru ekleyin
  7. Birim testinizi bildirmek için gerçekten küçük bir sınıf kullanın ve bunun gibi yönetilen koddan C ++ / Yerel koda atlayın (yazım hataları olabilir):

İşte bir örnek:

// 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();
  }
};

Bu yaklaşımla, insanların çok fazla C ++ / CLI öğrenmesi gerekmiyor, tüm gerçek testler C ++ yerelinde yapılacak ve TestShim sınıfı testi MSTest.exe'ye 'yayınlamak' (veya görünür kılmak için) ).

Yeni testler eklemek için, yeni bir [TestMethod] void NewTest () {:: NewTest ();} yöntemi ve yeni bir void NewTest () yerel işlevi beyan etmeniz yeterlidir. Makro yok, numara yok, doğruca.

Şimdi, heade dosyası isteğe bağlıdır, ancak Assert sınıfının yöntemlerini C ++ yerel imzalarla (örneğin, Stirng ^ yerine wchar_t *) ortaya çıkarmak için kullanılabilir, böylece onu C ++ 'ya yakın ve C ++ / CLI'den uzak tutabilirsiniz. :

İşte bir örnek:

// 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



4

VS9 ile birlikte çerçeve olan .NET, ancak bunu sürece sizsiniz, rahat bazı NET izm öğrenme, çoğu herhangi C ++ kodu test edebilmek gerektiği gibi, C ++ / CLI testleri yazabilirsiniz.

boost.test ve googletest oldukça benzer görünmektedir, ancak biraz farklı kullanımlar için uyarlanmıştır. Her ikisinin de ikili bir bileşeni vardır, bu nedenle, testleri derlemek ve çalıştırmak için çözümünüzde fazladan bir projeye ihtiyacınız olacak.

Kullandığımız çerçeve CxxTest'tir ve çok daha hafiftir; yalnızca başlıklarıdır ve başlıklarınızdan test paketi bilgilerini kazımak için bir Perl (!) komut dosyası kullanır (paketler CxxTest :: Base'den miras alır, tüm test yöntemlerinin adları "test" ile başlar). Açıkçası, bu, Perl'i bir kaynaktan veya başka bir kaynaktan almanızı gerektirir, bu da oluşturma ortamı kurulumunuza ek yük getirir.


CxxTest perl yerine python kullanabilir
Martin Beckett

Ayrıca, kodunuzun gerektirdiği tüm DLL'ler konusunda dikkatli olmanız gerekir - DLL'leri yüklemeye çalışırken NUnit ve mbUnit C ++ / CLI kodunu test ederken sorunlar yaşadım.
Andy Dent

2

Kullandığım UnitTest ++ .

Bu gönderiyi yaptığımdan beri geçen yıllarda kaynak SourceForge'dan github'a taşındı. Ayrıca örnek eğitim artık daha agnostiktir - hiçbir konfigürasyona veya proje kurulumuna girmez.

Proje dosyaları artık CMake aracılığıyla oluşturulduğundan, Visual Studio 6 için hala çalışacağından şüpheliyim. Eski sürüm desteğine hala ihtiyacınız varsa, SourceForge şubesi altında mevcut olan son sürümü alabilirsiniz .


2

Burada bahsedilen araçların tümü komut satırı araçlarıdır. Daha entegre bir çözüm arıyorsanız , C / C ++ birim testi için Visual Studio AddIn olan cfix studio'ya bakın . TestDriven.Net'e oldukça benzer, ancak .NET yerine (yönetilmeyen) C / C ++ içindir.


1

VS2005 ve Eclipse ile CppUnit kullandım . Wiki çok kapsamlı (özellikle JUnit'e aşinaysanız).


1

VS2008 hakkında% 100 emin değilim, ancak Microsoft'un VS2005'te Team Suite'in bir parçası olarak gönderdiği Unit Testing çerçevesinin C ++ için değil yalnızca .NET için olduğunu biliyorum.

CppUnit'i de kullandım ve iyiydi. NUnit / JUnit / benzeri ile hemen hemen aynı.

Güçlendirme kullandıysanız, ayrıca bir birim test kitaplığı da var

Boost'un arkasındaki adamlar bazı ciddi kodlama işlemlerine sahipler , bu yüzden çerçevelerinin oldukça iyi olması gerektiğini söyleyebilirim, ancak en kullanıcı dostu olmayabilir :-)


1

Aynı nedenlerden dolayı CxxTest'i de seviyorum. Bu yalnızca bir başlık dosyasıdır, bu nedenle bağlantı gerekmez. Bir Python koşucusu olduğu için Perl ile sıkışıp kalmazsınız. Yakında google kitaplığını gözden geçireceğim. Boost işleri çok fazla başka bagajı çekiyor.


1

Visual Studio 2008 için birim test cihazı, bildiğim kadarıyla yalnızca .NET kodu içindir.

CppUnit'i Visual Studio 2005'te kullandım ve oldukça iyi buldum.

Hatırladığım kadarıyla kurulum nispeten ağrısızdı. Test projelerinizde bağlayıcının (Bağlayıcı → Giriş → Ek Bağımlılıklar) cppunitd.lib'i içerdiğinden emin olun.

Ardından, #include <cppunit/extensions/HelperMacros.h>başlığınızda.

Daha sonra test sınıfınızın çalışmasını sağlamak için http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html'deki adımları takip edebilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.