วิธีตั้งค่าการทดสอบหน่วยสำหรับ Visual Studio C ++


93

ฉันมีปัญหาในการหาวิธีตั้งค่าเฟรมเวิร์กการทดสอบและใช้งานได้ในVisual Studio 2008สำหรับC++ชุดทดสอบหน่วยในตัว

ลิงก์หรือบทช่วยสอนใด ๆ จะได้รับการชื่นชม


Google เผยแพร่ C ++ Test Framework ซึ่งคล้ายกับกรอบ xUnit มาก http://code.google.com/p/googletest/
popopome

คุณใช้กรอบอะไร
Joakim Karlsson

อันที่จริงฉันยังไม่ได้ใช้เลย ฉันตัดสินใจว่าสิ่งที่ฉันกำลังทำกับการทดสอบหน่วยไม่ใช่การใช้เวลาอย่างมีประสิทธิภาพสูงสุด
DShook

คำตอบ:


56

หน้านี้อาจช่วยได้โดยจะทบทวนกรอบการทดสอบหน่วย C ++ ค่อนข้างน้อย:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • หน่วย ++
  • CxxTest

ตรวจสอบCPPUnitLiteหรือCPPUnitLite2

CPPUnitLiteสร้างขึ้นโดย Michael Feathers ซึ่งเดิมพอร์ต JUnit ของ Java เป็น C ++ เป็น CPPUnit (CPPUnit พยายามเลียนแบบรูปแบบการพัฒนาของ JUnit - แต่ C ++ ไม่มีคุณสมบัติของ Java [เช่นการสะท้อนแสง] เพื่อให้ใช้งานง่าย)

CPPUnitLite พยายามสร้างเฟรมเวิร์กการทดสอบสไตล์ C ++ ที่แท้จริงไม่ใช่ Java ที่พอร์ตไปยัง C ++ (ฉันถอดความจากหนังสือการทำงานอย่างมีประสิทธิภาพกับ Legacy Codeของ Feather ) ดูเหมือนว่าCPPUnitLite2จะเป็นการเขียนซ้ำโดยมีคุณสมบัติเพิ่มเติมและการแก้ไขข้อบกพร่อง

ฉันเพิ่งสะดุดในUnitTest ++ซึ่งรวมถึงสิ่งต่างๆจาก CPPUnitLite2 และกรอบงานอื่น ๆ

ไมโครซอฟท์ได้เปิดตัวWinUnit

ชำระเงินCatchหรือDoctest


2
Googletest คล้ายกับ boost :: test แต่ง่ายกว่าเล็กน้อยในการรวมเข้ากับ VS
Martin Beckett

3
ฉันแปลกใจที่Catchไม่ได้พูดถึงที่นี่ นอกจากนี้ยังมีการเช็คเอาต์doctest - reimplementation ของฉันจับที่มีความสำคัญอย่างมากต่อการรวบรวมความเร็ว - การชำระเงินคำถามที่พบบ่อยจะเห็นอะไรที่แตกต่างกันระหว่างสอง
onqtam

1
@onqtam อย่าแปลกใจเกินไปคำถาม / คำตอบนี้มาจากปี 2008! เพิ่มลิงก์ที่คุณแนะนำ
Aardvark

24

มีวิธีการทดสอบที่ไม่มีการจัดการ c ++ ใช้ในการสร้างการทดสอบกรอบ Visual Studio 2008 หากคุณสร้างโครงการทดสอบ C ++ โดยใช้ C ++ / CLI คุณสามารถโทรไปยัง DLL ที่ไม่มีการจัดการได้ คุณจะต้องเปลี่ยนการสนับสนุน Common Language Runtime เป็น / clr จาก / clr: ปลอดภัยหากคุณต้องการทดสอบโค้ดที่เขียนด้วย C ++ ที่ไม่มีการจัดการ

ฉันมีรายละเอียดทีละขั้นตอนในบล็อกของฉันที่นี่: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
สิ่งนี้วางข้อ จำกัด บางประการในรหัส C ++ ของคุณฉันมีฐานรหัสอย่างน้อยหนึ่งฐานที่การพยายามรวมส่วนหัวลงในรหัส C ++ / CLI นั้นมีปัญหามากกว่าที่ควรจะเป็น ประโยชน์ที่ยิ่งใหญ่สำหรับฉันในการใช้ C ++ / CLI คือคุณสามารถใช้การทดสอบพารามิเตอร์ที่ขี้ขลาดด้วยคุณสมบัติเช่น RowTest ใน mbUnit / NUnit / xUnit.Net
Andy Dent

9

นี่คือแนวทางที่ฉันใช้ในการทดสอบโมดูล IIS URL Rewrite ที่ Microsoft (เป็นแบบบรรทัดคำสั่ง แต่ควรใช้กับ VS ด้วย):

  1. ตรวจสอบให้แน่ใจว่าไฟล์ส่วนหัวของคุณสามารถใช้งานได้โดยการย้ายซอร์สโค้ดไปยังไฟล์ cpp และใช้การประกาศไปข้างหน้าหากจำเป็น
  2. คอมไพล์โค้ดของคุณเพื่อทดสอบเป็นไลบรารี (.lib)
  3. สร้างโครงการ UnitTest ของคุณเป็น C ++ ด้วยการสนับสนุน CLR
  4. รวมไฟล์ส่วนหัวของคุณ
  5. รวมไฟล์. lib ของคุณ
  6. เพิ่มการอ้างอิงไปยัง Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. ใช้คลาสขนาดเล็กมากสำหรับการประกาศการทดสอบหน่วยของคุณและข้ามจากการจัดการเป็น C ++ / โค้ดเนทีฟแบบนี้ (อาจพิมพ์ผิด)

นี่คือตัวอย่าง:

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

ด้วยวิธีนี้ผู้คนไม่จำเป็นต้องเรียนรู้เนื้อหา C ++ / CLI มากเกินไปการทดสอบจริงทั้งหมดจะทำใน C ++ เนทีฟและคลาส TestShim จะใช้เพื่อ 'เผยแพร่' การทดสอบไปยัง MSTest.exe (หรือทำให้มองเห็นได้ ).

สำหรับการเพิ่มการทดสอบใหม่คุณเพียงแค่ประกาศเมธอด [TestMethod] ใหม่เป็นโมฆะ NewTest () {:: NewTest ();} และฟังก์ชันเนทีฟ NewTest () โมฆะใหม่ ไม่มีมาโครไม่มีลูกเล่นตรงไปตรงมา

ตอนนี้ไฟล์ heade เป็นทางเลือก แต่สามารถใช้เพื่อแสดงเมธอดของคลาส Assert ด้วยลายเซ็นดั้งเดิมของ C ++ (เช่น wchar_t * แทนที่จะเป็น Stirng ^) ดังนั้นคุณจึงสามารถเก็บไว้ใกล้ C ++ และห่างไกลจาก C ++ / CLI ได้ :

นี่คือตัวอย่าง:

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

โดยส่วนตัวแล้วฉันชอบWinUnitเนื่องจากไม่ต้องการให้ฉันเขียนอะไรเลยยกเว้นการทดสอบของฉัน (ฉันสร้าง. dll เป็นการทดสอบไม่ใช่ exe) ฉันเพิ่งสร้างโปรเจ็กต์และชี้ WinUnit.exe ไปที่ไดเร็กทอรีผลลัพธ์การทดสอบของฉันและเรียกใช้ทุกอย่างที่พบ คุณสามารถดาวน์โหลดโครงการ WinUnit ที่นี่ (ตอนนี้ MSDN ต้องการให้คุณดาวน์โหลดปัญหาทั้งหมดไม่ใช่บทความ WinUnit รวมอยู่ใน)


4

เฟรมเวิร์กที่มาพร้อมกับ VS9 คือ . NET แต่คุณสามารถเขียนการทดสอบใน C ++ / CLI ได้ตราบใดที่คุณสบายใจที่จะเรียนรู้. NET isms คุณควรจะทดสอบโค้ด C ++ ส่วนใหญ่ได้

boost.test และgoogletest ดูคล้ายกันพอสมควร แต่ปรับให้เข้ากับการใช้งานที่แตกต่างกันเล็กน้อย ทั้งสองอย่างนี้มีองค์ประกอบไบนารีดังนั้นคุณจะต้องมีโครงการพิเศษในโซลูชันของคุณเพื่อรวบรวมและเรียกใช้การทดสอบ

กรอบที่เราใช้คือCxxTestซึ่งเบากว่ามาก เป็นส่วนหัวเท่านั้นและใช้สคริปต์ Perl (!) เพื่อดึงข้อมูลชุดทดสอบจากส่วนหัวของคุณ (ห้องชุดสืบทอดมาจาก CxxTest :: Base ชื่อวิธีการทดสอบทั้งหมดของคุณเริ่มต้นด้วย "test") เห็นได้ชัดว่านี้ต้องการให้คุณได้รับ Perl จากแหล่งหนึ่งหรืออีกซึ่งจะเพิ่มค่าใช้จ่ายในการติดตั้งการสร้างสภาพแวดล้อมของคุณ


CxxTest สามารถใช้ python แทน perl ได้
Martin Beckett

คุณต้องระวังเกี่ยวกับ DLL ที่รหัสของคุณต้องการ - ฉันมีปัญหากับ NUnit และ mbUnit ในการทดสอบรหัส C ++ / CLI พยายามโหลด DLL
Andy Dent

2

ผมใช้UnitTest ++

ในช่วงหลายปีที่ฉันโพสต์นี้แหล่งที่มาได้ย้ายจาก SourceForge ไปยัง github นอกจากนี้ตัวอย่างบทช่วยสอนยังไม่เชื่อเรื่องพระเจ้ามากขึ้น - ไม่ได้ไปที่การกำหนดค่าหรือการตั้งค่าโครงการ

ฉันสงสัยว่ามันจะยังใช้งานได้กับ Visual Studio 6 เนื่องจากตอนนี้ไฟล์โปรเจ็กต์ถูกสร้างผ่าน CMake หากคุณยังต้องการการสนับสนุนเวอร์ชันเก่าคุณสามารถรับเวอร์ชันล่าสุดที่มีอยู่ในสาขาSourceForge


2

เครื่องมือที่ถูกกล่าวถึงนี้เป็นเครื่องมือบรรทัดคำสั่งทั้งหมด หากคุณกำลังมองหาโซลูชันที่ผสานรวมมากขึ้นลองดูที่cfix studioซึ่งเป็น Visual Studio AddIn สำหรับการทดสอบหน่วย C / C ++ ค่อนข้างคล้ายกับ TestDriven.Net แต่สำหรับ (ไม่มีการจัดการ) C / C ++ แทนที่จะเป็น. NET


1

ฉันใช้CppUnitกับ VS2005 และ Eclipse วิกินี้มีความละเอียดถี่ถ้วนมาก (โดยเฉพาะถ้าคุณคุ้นเคยกับ JUnit)


1

ฉันไม่แน่ใจ 100% เกี่ยวกับ VS2008 แต่ฉันรู้ว่าเฟรมเวิร์กการทดสอบหน่วยที่ไมโครซอฟท์จัดส่งใน VS2005 เป็นส่วนหนึ่งของ Team Suite นั้นใช้สำหรับ. NET เท่านั้นไม่ใช่ C ++

ฉันเคยใช้ CppUnit แล้วและมันก็โอเค เช่นเดียวกับ NUnit / JUnit / so on

หากคุณเคยใช้บูสต์พวกเขายังมีไลบรารีการทดสอบหน่วย

คนที่อยู่เบื้องหลังการเพิ่มกำลังมีการเข้ารหัสที่จริงจังดังนั้นฉันจึงบอกว่าเฟรมเวิร์กของพวกเขาควรจะค่อนข้างดี แต่อาจไม่เป็นมิตรกับผู้ใช้มากที่สุด :-)


1

ฉันชอบ CxxTest เช่นกันด้วยเหตุผลเดียวกัน เป็นไฟล์ส่วนหัวเท่านั้นจึงไม่จำเป็นต้องเชื่อมโยง คุณไม่ได้ติดอยู่กับ Perl เนื่องจากมีนักวิ่ง Python เช่นกัน ฉันจะตรวจสอบห้องสมุด Google เร็ว ๆ นี้ ของ Boost ดึงสัมภาระอื่น ๆ เข้าไปมากเกินไป


1

เครื่องทดสอบหน่วยสำหรับ Visual Studio 2008 ใช้สำหรับรหัส. NET เท่านั้นเท่าที่ฉันรู้

ฉันใช้ CppUnit บน Visual Studio 2005 และพบว่ามันค่อนข้างดี

เท่าที่ฉันจำได้การตั้งค่านั้นค่อนข้างไม่เจ็บปวด ตรวจสอบให้แน่ใจว่าในโครงการทดสอบของคุณตัวเชื่อมโยง (Linker →อินพุต→การอ้างอิงเพิ่มเติม) รวมถึง cppunitd.lib

จากนั้น#include <cppunit/extensions/HelperMacros.h>ในส่วนหัวของคุณ

จากนั้นคุณสามารถทำตามขั้นตอนในhttp://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.htmlเพื่อให้คลาสทดสอบของคุณทำงานได้


1

ฉันรู้สึกทุกข์ทรมานกับการใช้การทดสอบหน่วยสำหรับแอปพลิเคชัน C ++ ที่ไม่มีการจัดการในสภาพแวดล้อม Windows ด้วย Visual Studio ดังนั้นฉันจึงจัดการเพื่อเอาชนะและเขียนโพสต์เป็นคำแนะนำทีละขั้นตอนสำหรับการทดสอบหน่วยแอปพลิเคชัน C ++ ที่ไม่มีการจัดการ ฉันหวังว่ามันอาจช่วยคุณได้

การทดสอบหน่วยสำหรับ C ++ ที่ไม่มีการจัดการใน Visual Studio

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.