Cách thiết lập kiểm thử đơn vị cho Visual Studio C ++


93

Tôi đang gặp khó khăn để tìm hiểu làm thế nào để có được những khuôn khổ kiểm tra thiết lập và sử dụng được trong Visual Studio 2008 cho C++lẽ với bộ ứng dụng tích hợp trong đơn vị thử nghiệm.

Bất kỳ liên kết hoặc hướng dẫn sẽ được đánh giá cao.


Google phát hành C ++ Test Framework rất giống với các framework xUnit. http://code.google.com/p/googletest/
popopome

Bạn đã sử dụng khuôn khổ nào?
Joakim Karlsson

thực sự tôi vẫn chưa sử dụng bất kỳ cái nào trong số chúng. Tôi quyết định rằng những gì tôi đang làm trong các bài kiểm tra đơn vị không phải là cách sử dụng thời gian hiệu quả nhất.
DShook

Câu trả lời:


56

Trang này có thể hữu ích, nó đánh giá khá nhiều khung kiểm tra đơn vị C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Đơn vị ++
  • CxxTest

Kiểm tra CPPUnitLite hoặc CPPUnitLite2 .

CPPUnitLite được tạo ra bởi Michael Feathers, người ban đầu đã chuyển JUnit của Java sang C ++ dưới dạng CPPUnit (CPPUnit cố gắng bắt chước mô hình phát triển của JUnit - nhưng C ++ thiếu các tính năng của Java [ví dụ: phản chiếu] để dễ sử dụng).

CPPUnitLite cố gắng tạo ra một khung kiểm tra kiểu C ++ thực sự, chứ không phải một khung Java được chuyển sang C ++. (Tôi đang diễn giải từ cuốn sách Làm việc hiệu quả với Legacy Code của Feather ). CPPUnitLite2 dường như là một bản viết lại khác, với nhiều tính năng hơn và sửa lỗi.

Tôi cũng chỉ tình cờ xem UnitTest ++ bao gồm những thứ từ CPPUnitLite2 và một số khuôn khổ khác.

Microsoft đã phát hành WinUnit .

Cũng kiểm tra Catch hoặc Doctest


2
Googletest rất giống với boost :: kiểm tra nhưng một chút dễ dàng hơn để hòa nhập vào VS
Martin Beckett

3
Tôi ngạc nhiên là Catch không được đề cập ở đây. Cũng kiểm tra doctest - reimplementation của tôi về Catch với trọng tâm là rất lớn về tốc độ biên soạn - kiểm tra các câu hỏi thường gặp để xem whats khác nhau giữa hai
onqtam

1
@onqtam đừng quá ngạc nhiên, câu hỏi / câu trả lời này có từ năm 2008! Đã thêm cho bạn các liên kết được đề xuất.
Aardvark

24

Có một cách để kiểm tra C ++ không được quản lý bằng cách sử dụng khung kiểm tra được xây dựng trong Visual Studio 2008 . Nếu bạn tạo Dự án thử nghiệm C ++, sử dụng C ++ / CLI, thì bạn có thể thực hiện các cuộc gọi đến một DLL không được quản lý. Bạn sẽ phải chuyển hỗ trợ Common Language Runtime sang / clr từ / clr: safe nếu bạn muốn kiểm tra mã được viết bằng C ++ không được quản lý.

Tôi có chi tiết từng bước trên blog của mình tại đây: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
Điều này đặt ra những hạn chế nhất định đối với mã C ++ của bạn, tôi đã có ít nhất một cơ sở mã mà việc cố gắng đưa các tiêu đề của nó vào mã C ++ / CLI gặp nhiều rắc rối hơn đáng giá. Lợi ích lớn đối với tôi sử dụng C ++ / CLI là bạn có thể sử dụng sôi nổi parameterised thử nghiệm với các thuộc tính như RowTest trong mbUnit / NUnit / xUnit.Net
Andy Dent

9

Đây là phương pháp tôi sử dụng để kiểm tra mô-đun IIS URL Rewrite tại Microsoft (nó dựa trên dòng lệnh, nhưng cũng sẽ hoạt động cho VS):

  1. Đảm bảo rằng các tệp tiêu đề của bạn có thể sử dụng được bằng cách chuyển mã nguồn sang tệp cpp và sử dụng khai báo chuyển tiếp nếu cần.
  2. Biên dịch mã của bạn để kiểm tra dưới dạng thư viện (.lib)
  3. Tạo dự án UnitTest của bạn dưới dạng C ++ với hỗ trợ CLR.
  4. Bao gồm các tệp tiêu đề của bạn.
  5. Bao gồm các tệp .lib của bạn.
  6. Thêm tham chiếu đến Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Sử dụng một lớp thực sự nhỏ để khai báo bài kiểm tra đơn vị của bạn và chuyển từ mã được quản lý sang C ++ / Native như thế này (có thể mắc lỗi chính tả):

Đây là một ví dụ:

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

Với cách tiếp cận này, mọi người không phải học quá nhiều thứ C ++ / CLI, tất cả bài kiểm tra thực sự sẽ được thực hiện bằng C ++ gốc và lớp TestShim sẽ được sử dụng để 'xuất bản' bài kiểm tra lên MSTest.exe (hoặc hiển thị nó ).

Để thêm các bài kiểm tra mới, bạn chỉ cần khai báo một phương thức [TestMethod] void NewTest () {:: NewTest ();} mới và một hàm gốc void NewTest () mới. Không có macro, không có thủ thuật, đơn giản.

Bây giờ, tệp heade là tùy chọn, nhưng nó có thể được sử dụng để hiển thị các phương thức của lớp Assert với chữ ký gốc C ++ (ví dụ: wchar_t * thay vì Stirng ^), vì vậy bạn có thể giữ nó gần với C ++ và xa C ++ / CLI :

Đây là một ví dụ:

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


6

Cá nhân tôi thích WinUnit hơn vì nó không yêu cầu tôi viết bất cứ thứ gì ngoại trừ các bài kiểm tra của tôi (tôi tạo .dll làm bài kiểm tra, không phải exe). Tôi chỉ xây dựng một dự án và trỏ WinUnit.exe đến thư mục đầu ra thử nghiệm của tôi và nó chạy mọi thứ mà nó tìm thấy. Bạn có thể tải xuống dự án WinUnit tại đây . (MSDN hiện yêu cầu bạn tải xuống toàn bộ vấn đề, không phải bài báo. WinUnit được bao gồm trong.)


4

Khung bao gồm VS9 .NET, nhưng bạn có thể viết các bài kiểm tra bằng C ++ / CLI, vì vậy, miễn là bạn cảm thấy thoải mái khi học một số phần mềm .NET, bạn sẽ có thể kiểm tra hầu hết mọi mã C ++.

boost.testgoogletest trông khá giống nhau, nhưng được điều chỉnh cho các mục đích sử dụng hơi khác nhau. Cả hai đều có thành phần nhị phân, vì vậy bạn sẽ cần một dự án bổ sung trong giải pháp của mình để biên dịch và chạy thử nghiệm.

Khung mà chúng tôi sử dụng là CxxTest , nhẹ hơn nhiều; nó chỉ là tiêu đề và sử dụng tập lệnh Perl (!) để quét thông tin bộ thử nghiệm từ các tiêu đề của bạn (các bộ kế thừa từ CxxTest :: Base, tất cả các tên phương pháp thử nghiệm của bạn đều bắt đầu bằng "test"). Rõ ràng, điều này yêu cầu bạn lấy Perl từ nguồn này hay nguồn khác , điều này làm tăng thêm chi phí cho thiết lập môi trường xây dựng của bạn.


CxxTest có thể sử dụng python thay vì perl
Martin Beckett

Bạn cũng cần phải cẩn thận về bất kỳ tệp DLL nào được yêu cầu bởi mã của bạn - Tôi đã gặp sự cố với mã C ++ / CLI thử nghiệm NUnit và mbUnit, cố gắng tải các tệp DLL.
Andy Dent,

2

Tôi sử dụng UnitTest ++ .

Trong những năm kể từ khi tôi thực hiện bài đăng này, nguồn đã chuyển từ SourceForge sang github. Ngoài ra, hướng dẫn ví dụ bây giờ là bất khả tri hơn - không đi vào bất kỳ cấu hình hoặc dự án nào được thiết lập.

Tôi nghi ngờ nó sẽ vẫn hoạt động cho Visual Studio 6 vì các tệp dự án hiện được tạo thông qua CMake. Nếu bạn vẫn cần hỗ trợ phiên bản cũ hơn, bạn có thể tải phiên bản có sẵn cuối cùng dưới nhánh SourceForge .


2

Các công cụ đã được đề cập ở đây là tất cả các công cụ dòng lệnh. Nếu bạn tìm kiếm một giải pháp tích hợp hơn, hãy xem cfix studio , là một Visual Studio AddIn để thử nghiệm đơn vị C / C ++. Nó khá giống với TestDriven.Net, nhưng dành cho C / C ++ (không được quản lý) hơn là .NET.


1

Tôi đã sử dụng CppUnit với VS2005 và Eclipse. Wiki rất kỹ lưỡng (đặc biệt nếu bạn đã quen thuộc với JUnit).


1

Tôi không chắc 100% về VS2008, nhưng tôi biết rằng khung Unit Testing mà microsoft đã vận chuyển trong VS2005 như một phần của Team Suite của họ chỉ dành cho .NET, không phải C ++

Tôi cũng đã sử dụng CppUnit và nó ổn. Cũng giống như NUnit / JUnit / v.v.

Nếu bạn đã sử dụng boost, họ cũng có một thư viện kiểm tra đơn vị

Những người đứng sau boost có một số đoạn mã nghiêm túc , vì vậy tôi muốn nói rằng khung của họ phải khá tốt, nhưng nó có thể không thân thiện với người dùng nhất :-)


1

Tôi thích CxxTest vì những lý do tương tự. Nó chỉ là một tệp tiêu đề nên không cần liên kết. Bạn không bị mắc kẹt với Perl vì cũng có một người chạy Python. Tôi sẽ xem xét thư viện google sớm. Công cụ Boost kéo quá nhiều hành lý khác.


1

Trình kiểm tra đơn vị cho Visual Studio 2008 chỉ dành cho mã .NET theo như tôi biết.

Tôi đã sử dụng CppUnit trên Visual Studio 2005 và thấy nó hoạt động khá tốt.

Theo như tôi nhớ, việc thiết lập tương đối dễ dàng. Chỉ cần đảm bảo rằng trong các dự án thử nghiệm của bạn, trình liên kết (Trình liên kết → Đầu vào → Phụ thuộc bổ sung) bao gồm cppunitd.lib.

Sau đó, #include <cppunit/extensions/HelperMacros.h>trong tiêu đề của bạn.

Sau đó, bạn có thể làm theo các bước trong http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html để lớp thử nghiệm của bạn hoạt động.


1

Tôi đã phải cố gắng triển khai thử nghiệm đơn vị cho một ứng dụng C ++ không được quản lý trong môi trường Windows với Visual Studio. Vì vậy, tôi đã cố gắng vượt qua và viết một bài đăng dưới dạng hướng dẫn từng bước để kiểm tra đơn vị ứng dụng C ++ không được quản lý. Tôi hy vọng nó có thể giúp bạn.

Bài kiểm tra đơn vị cho C ++ không được quản lý trong Visual Studio

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.