Я начинаю с существующего монолитного проекта Visual Studio 2012 с расширением .exe. Я хочу добавить собственный проект модульного тестирования, согласно http://msdn.microsoft.com/en-us/library/hh419385.aspx#objectRef, который предполагает, что это поддерживается:
Тестируемый код создается в виде файла .exe: добавьте отдельный тестовый проект. Свяжите его с выходным объектным файлом.
Я dllexport
создал методы, которые мне нужно было протестировать, связал мой тестовый проект с .lib
библиотекой exe-проекта, и, похоже, все заработало для моих простых тестовых функций. Однако, как только я попробовал что-то более интересное, я начал получать нарушения прав доступа, подобные этому:
Исключение первого шанса по адресу 0x04fa4aac (TestApplication.exe) в vstest.executionengine.x86.exe: 0xC0000005: место чтения нарушения прав доступа 0x011bf0e0.
Поэтому я создал новое решение с самой простой парой проектов .exe и Unity Test, которую только мог собрать, и смог воспроизвести исключения с помощью этого вызывающего объекта (проект Unit Test) и вызываемого объекта (проект .exe):
Вызываемый абонент (проект .exe) Header.h
:
#include <string>
__declspec( dllexport ) std::string __cdecl strTest( std::string j );
Вызываемый абонент (проект .exe) Header.cpp
:
#include "Header.h"
std::string strTest( std::string j ) {
std::string output;
output += j;
output += "HAHA";
return output;
}
Вызывающий абонент (проект модульного тестирования) unittest1.cpp
:
#include "CppUnitTest.h"
#include "../TestApplication/Header.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest {
TEST_CLASS(UnitTest1) {
public:
TEST_METHOD(TestMethod1) {
std::string test = strTest( "bla " );
}
};
}
Нарушение прав доступа всегда происходит внутри конструктора std::string
, вызываемого строкой std::string output;
в strTest()
.
Я убедился, что оба проекта имеют идентичные настройки (особенно соглашение о вызовах, настройки оптимизации/отладки, разрядность и набор символов). Я также отключил и удалил предварительно скомпилированные заголовки для обоих проектов.
Я даже пытался создать второй проект exe с функциями, указанными выше, и имел ссылку на основной проект exe против второго проекта exe. Это сработало отлично. Когда я попытался связать свой проект Unit Test с этим вторым exe-проектом, точно так же, как у меня работал мой основной exe-проект, я снова получил те же нарушения прав доступа.
Единственное, что сработало, это преобразовать мой exe-проект в dll-проект (буквально просто изменив Тип конфигурации моего exe-проекта с Application (.exe)
на Dynamic Library (.dll)
).
Итак, вопрос в том, могу ли я каким-то образом получить модульное тестирование моего исполняемого проекта с помощью модульного тестирования Visual Studio 2012, или я должен уже начать разбивать его на библиотеки DLL?
Редактировать:
Я отправил сообщение об этом в Microsoft Connect, и мне сказали, что это действительно ошибка: https://connect.microsoft.com/VisualStudio/feedback/details/804696/linking-visual-studio-2012-c-unit-testing-project-против-an-exe-причины-нарушения-доступа
Я провел еще несколько тестов, используя то же решение, которое я прикрепил к совершенно новым установкам Windows 7 Pro x64 SP1 и Windows 8.1 Pro Preview x64 на виртуальных машинах VMware Workstation 9. Для каждого теста не устанавливалось ничего, кроме всех обновлений Windows и конкретной Visual Studio. Я всегда возвращался к чистому снимку между тестами. Я также запускал все Visual Studio со всеми настройками по умолчанию.
В Windows 7 все, что я пробовал, приводило к одному и тому же нарушению прав доступа. Я попробовал свое решение с помощью:
- Visual Studio Express 2012 для рабочего стола Windows с обновлением 2
- Visual Studio Express 2012 для рабочего стола Windows с обновлением 3
- Visual Studio 2012 Ultimate с обновлением 3
- Visual Studio 2013 RC Professional
В Windows 8.1 с Visual Studio Express 2012 для рабочего стола Windows с обновлением 3 мои модульные тесты работали нормально. Я предполагаю, что другие комбинации, которые я пробовал в Windows 7, отлично работают в 8.1.
Вернувшись в Windows 7, когда я переключился с платформы x86 на платформу x64 и установил архитектуру процессора по умолчанию для параметров теста на X64, тот же тест прошел. У меня больше не было нарушений прав доступа.
Поэтому, скорее всего, проблема связана с платформой Windows 7/x86.
Кроме того, что касается нарушения доступа, это не всегда так изящно. Я также иногда получаю диалоговое окно «vstest.executionengine.x86.exe перестало работать» со следующими подробностями проблемы:
Problem signature:
Problem Event Name: BEX
Application Name: vstest.executionengine.x86.exe
Application Version: 12.0.20827.3
Application Timestamp: 521cc637
Fault Module Name: StackHash_9321
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Offset: 00ae9998
Exception Code: c0000005
Exception Data: 00000008
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1033
Additional Information 1: 9321
Additional Information 2: 9321642ea520dd869526c054c7161ae9
Additional Information 3: bfae
Additional Information 4: bfaed60192419c1d7d34eac41dbe71a8