ฉันมีปัญหาในการหาวิธีตั้งค่าเฟรมเวิร์กการทดสอบและใช้งานได้ในVisual Studio 2008สำหรับC++
ชุดทดสอบหน่วยในตัว
ลิงก์หรือบทช่วยสอนใด ๆ จะได้รับการชื่นชม
ฉันมีปัญหาในการหาวิธีตั้งค่าเฟรมเวิร์กการทดสอบและใช้งานได้ในVisual Studio 2008สำหรับC++
ชุดทดสอบหน่วยในตัว
ลิงก์หรือบทช่วยสอนใด ๆ จะได้รับการชื่นชม
คำตอบ:
หน้านี้อาจช่วยได้โดยจะทบทวนกรอบการทดสอบหน่วย C ++ ค่อนข้างน้อย:
ตรวจสอบCPPUnitLiteหรือCPPUnitLite2
CPPUnitLiteสร้างขึ้นโดย Michael Feathers ซึ่งเดิมพอร์ต JUnit ของ Java เป็น C ++ เป็น CPPUnit (CPPUnit พยายามเลียนแบบรูปแบบการพัฒนาของ JUnit - แต่ C ++ ไม่มีคุณสมบัติของ Java [เช่นการสะท้อนแสง] เพื่อให้ใช้งานง่าย)
CPPUnitLite พยายามสร้างเฟรมเวิร์กการทดสอบสไตล์ C ++ ที่แท้จริงไม่ใช่ Java ที่พอร์ตไปยัง C ++ (ฉันถอดความจากหนังสือการทำงานอย่างมีประสิทธิภาพกับ Legacy Codeของ Feather ) ดูเหมือนว่าCPPUnitLite2จะเป็นการเขียนซ้ำโดยมีคุณสมบัติเพิ่มเติมและการแก้ไขข้อบกพร่อง
ฉันเพิ่งสะดุดในUnitTest ++ซึ่งรวมถึงสิ่งต่างๆจาก CPPUnitLite2 และกรอบงานอื่น ๆ
มีวิธีการทดสอบที่ไม่มีการจัดการ 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/
นี่คือแนวทางที่ฉันใช้ในการทดสอบโมดูล IIS URL Rewrite ที่ Microsoft (เป็นแบบบรรทัดคำสั่ง แต่ควรใช้กับ VS ด้วย):
นี่คือตัวอย่าง:
// 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
โดยส่วนตัวแล้วฉันชอบWinUnitเนื่องจากไม่ต้องการให้ฉันเขียนอะไรเลยยกเว้นการทดสอบของฉัน (ฉันสร้าง. dll เป็นการทดสอบไม่ใช่ exe) ฉันเพิ่งสร้างโปรเจ็กต์และชี้ WinUnit.exe ไปที่ไดเร็กทอรีผลลัพธ์การทดสอบของฉันและเรียกใช้ทุกอย่างที่พบ คุณสามารถดาวน์โหลดโครงการ WinUnit ที่นี่ (ตอนนี้ MSDN ต้องการให้คุณดาวน์โหลดปัญหาทั้งหมดไม่ใช่บทความ WinUnit รวมอยู่ใน)
เฟรมเวิร์กที่มาพร้อมกับ VS9 คือ . NET แต่คุณสามารถเขียนการทดสอบใน C ++ / CLI ได้ตราบใดที่คุณสบายใจที่จะเรียนรู้. NET isms คุณควรจะทดสอบโค้ด C ++ ส่วนใหญ่ได้
boost.test และgoogletest ดูคล้ายกันพอสมควร แต่ปรับให้เข้ากับการใช้งานที่แตกต่างกันเล็กน้อย ทั้งสองอย่างนี้มีองค์ประกอบไบนารีดังนั้นคุณจะต้องมีโครงการพิเศษในโซลูชันของคุณเพื่อรวบรวมและเรียกใช้การทดสอบ
กรอบที่เราใช้คือCxxTestซึ่งเบากว่ามาก เป็นส่วนหัวเท่านั้นและใช้สคริปต์ Perl (!) เพื่อดึงข้อมูลชุดทดสอบจากส่วนหัวของคุณ (ห้องชุดสืบทอดมาจาก CxxTest :: Base ชื่อวิธีการทดสอบทั้งหมดของคุณเริ่มต้นด้วย "test") เห็นได้ชัดว่านี้ต้องการให้คุณได้รับ Perl จากแหล่งหนึ่งหรืออีกซึ่งจะเพิ่มค่าใช้จ่ายในการติดตั้งการสร้างสภาพแวดล้อมของคุณ
ผมใช้UnitTest ++
ในช่วงหลายปีที่ฉันโพสต์นี้แหล่งที่มาได้ย้ายจาก SourceForge ไปยัง github นอกจากนี้ตัวอย่างบทช่วยสอนยังไม่เชื่อเรื่องพระเจ้ามากขึ้น - ไม่ได้ไปที่การกำหนดค่าหรือการตั้งค่าโครงการ
ฉันสงสัยว่ามันจะยังใช้งานได้กับ Visual Studio 6 เนื่องจากตอนนี้ไฟล์โปรเจ็กต์ถูกสร้างผ่าน CMake หากคุณยังต้องการการสนับสนุนเวอร์ชันเก่าคุณสามารถรับเวอร์ชันล่าสุดที่มีอยู่ในสาขาSourceForge
เครื่องมือที่ถูกกล่าวถึงนี้เป็นเครื่องมือบรรทัดคำสั่งทั้งหมด หากคุณกำลังมองหาโซลูชันที่ผสานรวมมากขึ้นลองดูที่cfix studioซึ่งเป็น Visual Studio AddIn สำหรับการทดสอบหน่วย C / C ++ ค่อนข้างคล้ายกับ TestDriven.Net แต่สำหรับ (ไม่มีการจัดการ) C / C ++ แทนที่จะเป็น. NET
ฉันใช้CppUnitกับ VS2005 และ Eclipse วิกินี้มีความละเอียดถี่ถ้วนมาก (โดยเฉพาะถ้าคุณคุ้นเคยกับ JUnit)
ฉันไม่แน่ใจ 100% เกี่ยวกับ VS2008 แต่ฉันรู้ว่าเฟรมเวิร์กการทดสอบหน่วยที่ไมโครซอฟท์จัดส่งใน VS2005 เป็นส่วนหนึ่งของ Team Suite นั้นใช้สำหรับ. NET เท่านั้นไม่ใช่ C ++
ฉันเคยใช้ CppUnit แล้วและมันก็โอเค เช่นเดียวกับ NUnit / JUnit / so on
หากคุณเคยใช้บูสต์พวกเขายังมีไลบรารีการทดสอบหน่วย
คนที่อยู่เบื้องหลังการเพิ่มกำลังมีการเข้ารหัสที่จริงจังดังนั้นฉันจึงบอกว่าเฟรมเวิร์กของพวกเขาควรจะค่อนข้างดี แต่อาจไม่เป็นมิตรกับผู้ใช้มากที่สุด :-)
ฉันชอบ CxxTest เช่นกันด้วยเหตุผลเดียวกัน เป็นไฟล์ส่วนหัวเท่านั้นจึงไม่จำเป็นต้องเชื่อมโยง คุณไม่ได้ติดอยู่กับ Perl เนื่องจากมีนักวิ่ง Python เช่นกัน ฉันจะตรวจสอบห้องสมุด Google เร็ว ๆ นี้ ของ Boost ดึงสัมภาระอื่น ๆ เข้าไปมากเกินไป
เครื่องทดสอบหน่วยสำหรับ 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เพื่อให้คลาสทดสอบของคุณทำงานได้
ฉันรู้สึกทุกข์ทรมานกับการใช้การทดสอบหน่วยสำหรับแอปพลิเคชัน C ++ ที่ไม่มีการจัดการในสภาพแวดล้อม Windows ด้วย Visual Studio ดังนั้นฉันจึงจัดการเพื่อเอาชนะและเขียนโพสต์เป็นคำแนะนำทีละขั้นตอนสำหรับการทดสอบหน่วยแอปพลิเคชัน C ++ ที่ไม่มีการจัดการ ฉันหวังว่ามันอาจช่วยคุณได้