Как настроить поблочное тестирование на Visual Studio C++

У меня была эта точная проблема при разработке приложения Spring Boot в STS, но в конечном итоге развертывание упакованной войны в WebSphere (v.9). Основываясь на предыдущих ответах, моя ситуация была уникальной. ojdbc8.jar был в моей папке WEB-INF / lib с установленным набором родительского последнего класса, но всегда говорит, что не удалось найти подходящий драйвер.

Моя последняя проблема заключалась в том, что я использовал неправильный класс DataSource потому что я просто следил за онлайн-учебниками / примерами. Нашел подсказку благодаря тому, что Дэвид Дай прокомментировал свой собственный вопрос: Spring JDBC Не удалось загрузить класс драйвера JDBC [oracle.jdbc.driver.OracleDriver]

Также позже был найден весенний гуру пример с конкретным драйвером Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Пример, который вызывает ошибку, используя org.springframework.jdbc.datasource.DriverManagerDataSource на основе общих примеров .

@Config
@EnableTransactionManagement
public class appDataConfig {
 \* Other Bean Defs *\
    @Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password");
        dataSource.setSchema("MY_SCHEMA");
        return dataSource;
    }
}

И исправленный exapmle с использованием oracle.jdbc.pool.OracleDataSource:

@Config
@EnableTransactionManagement
public class appDataConfig {
/* Other Bean Defs */
@Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        OracleDataSource datasource = null;
        try {
            datasource = new OracleDataSource();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID");
        datasource.setUser("user");
        datasource.setPassword("password");

        return datasource;
    }
}

92
задан Peter Mortensen 14 October 2009 в 23:53
поделиться

11 ответов

Эта страница может помочь, она рассматривает довольно много платформ модульного теста C++:

  • Повышение CppUnit
  • . Тест
  • единица CppUnitLite
  • NanoCppUnit
  • ++
  • Выезд CxxTest

CPPUnitLite или CPPUnitLite2.

CPPUnitLite был создан Michael Feathers, который первоначально портировал JUnit Java к C++ как CPPUnit (попытки CPPUnit подражают модели разработки JUnit - но C++ испытывает недостаток в функциях Java [например, отражение], чтобы облегчить использовать).

CPPUnitLite пытается сделать истинную среду тестирования в стиле С++, не Java один портированный к C++. (Я перефразирую от Растушевки Работа Эффективно с Унаследованным кодом книга). CPPUnitLite2, кажется, другая перезапись с большим количеством функций и исправлений ошибок.

я также просто споткнулся через [1 131] UnitTest ++ , который включает материал от CPPUnitLite2 и некоторой другой платформы.

Microsoft выпустила WinUnit.

Также контроль Выгода или Doctest

56
ответ дан Aardvark 24 November 2019 в 06:34
поделиться

Лично, я предпочитаю WinUnit, так как он не требует меня к запись ничто за исключением моих тестов (я создаю .dll как тест, не exe). Я просто разрабатываю проект и указываю на WinUnit.exe на мой тестовый выходной каталог, и он выполняет все, что он находит. Вы можете загружать проект WinUnit здесь . (MSDN теперь требует, чтобы Вы загрузили всю проблему, не статью. WinUnit включен в.)

6
ответ дан moswald 24 November 2019 в 06:34
поделиться

Платформа, включенная с VS9 , .NET, но Вы можете тесты записи в C++ / CLI, поэтому, пока Вы - удобное изучение некоторых измов.NET, необходимо быть в состоянии протестировать большую часть любого кода C++.

boost.test и googletest надеются быть довольно подобным, но адаптированный к немного отличающемуся использованию. Оба из них имеют двоичный компонент, таким образом, Вам будет нужен дополнительный проект в Вашем решении скомпилировать и запустить тесты.

платформа, которую мы используем, CxxTest, который намного легче; это - заголовки только и использует сценарий Perl (!) для очистки информации о наборе тестов от заголовков (комплекты наследовались CxxTest:: Основа, имена всех Ваших методов тестирования запускаются с "теста"). Очевидно, это требует, чтобы Вы получили Perl от один источник или другой , который добавляет наверху к Вашей установке среды сборки.

4
ответ дан Ben Straub 24 November 2019 в 06:34
поделиться

Я использую UnitTest ++ .

В годах, так как я сделал это сообщение, которое источник переместил от SourceForge до GitHub. Также учебное руководство в качестве примера является теперь большим количеством агностика - не входит ни в какую конфигурацию или проект, настроенный вообще.

я сомневаюсь, что это будет все еще работать на Visual Studio 6, поскольку файлы проекта теперь создаются через CMake. При тихой необходимости в более старой поддержке версии, можно получить последнюю доступную версию под ответвление SourceForge.

2
ответ дан graham.reeds 24 November 2019 в 06:34
поделиться

Я использовал CppUnit с VS2005 и Eclipse. Wiki очень полна (особенно, если Вы знакомы с JUnit).

1
ответ дан colgur 24 November 2019 в 06:34
поделиться

Я не на 100% уверен в VS2008, но я знаю, что платформа Поблочного тестирования, что Microsoft, поставленная в VS2005 как часть их Комплекта Команды, была только для.NET, не C++

, я использовал CppUnit также, и это было в порядке. Почти такой же как NUnit/JUnit/so на.

, Если Вы использовали повышение, у них также есть библиотека поблочного тестирования

, парни позади повышения имеют [приблизительно 115] серьезные блоки кода, таким образом, я сказал бы, что их платформа должна быть довольно хорошей, но это не мог бы быть самый удобный для пользователя:-)

1
ответ дан Orion Edwards 24 November 2019 в 06:34
поделиться

Мне нравится CxxTest также по тем же причинам. Это - заголовочный файл только так никакое требуемое соединение. Вы не застреваете с Perl, поскольку существует бегун Python также. Я буду рассматривать библиотеку Google скоро. Материал Повышения вытягивает в слишком большом количестве другого багажа.

1
ответ дан ZebZiggle 24 November 2019 в 06:34
поделиться

Тестер единицы для Visual  Studio  2008 только для кода.NET, насколько я знаю.

я использовал CppUnit на Visual  Studio  2005 и найденный им, чтобы быть довольно хорошим.

, Насколько я помню, установка была относительно безболезненной. Просто удостоверьтесь, что в Вашем тестировании предполагает, что компоновщик (Компоновщик в †’ Вход в †’ Дополнительные Зависимости) включает cppunitd.lib.

Затем #include <cppunit/extensions/HelperMacros.h> в Вашем заголовке.

можно тогда выполнить шаги в http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html для получения тестовой работы класса.

1
ответ дан Peter Mortensen 24 November 2019 в 06:34
поделиться

Существует способ тестирования неуправляемого C ++ с использованием встроенной среды тестирования в Visual Studio 2008 . Если вы создаете тестовый проект C ++, используя C ++ / CLI, вы можете делать вызовы неуправляемой DLL. Вам придется переключить поддержку Common Language Runtime на / clr из / clr: safe, если вы хотите протестировать код, написанный на неуправляемом C ++.

У меня есть пошаговые подробности в моем блоге здесь: http: //msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/

24
ответ дан 24 November 2019 в 06:34
поделиться

Все упомянутые здесь инструменты являются инструментами командной строки. Если вы ищете более интегрированное решение, обратите внимание на cfix studio , который представляет собой надстройку Visual Studio для модульного тестирования C / C ++. Он очень похож на TestDriven.Net, но для (неуправляемого) C / C ++, а не для .NET.

2
ответ дан 24 November 2019 в 06:34
поделиться

Вот подход, который я использую для тестирования модуля IIS URL Rewrite в Microsoft (он основан на командной строке, но должен работать и для VS):

  1. Убедитесь, что ваши файлы заголовков пригодны для использования, переместив исходный код в файлы cpp и при необходимости используя предварительное объявление.
  2. Скомпилируйте код для тестирования как библиотеку (.lib)
  3. Создайте свой проект UnitTest как C ++ с поддержкой CLR.
  4. Включите файлы заголовков.
  5. Включите файлы .lib.
  6. Добавьте ссылку на Microsoft.VisualStudio.QualityTools. UnitTestFramework.dll
  7. Используйте действительно небольшой класс для объявления вашего модульного теста и переходите от управляемого кода к C ++ / Native, как это (могут быть опечатки):

Вот пример:

// 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] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest (). Никаких макросов, никаких трюков, все просто.

Теперь файл заголовка необязателен, но его можно использовать для предоставления методов класса 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

dll
  • Используйте действительно небольшой класс для объявления вашего модульного теста и переходите от управляемого кода к C ++ / Native, как это (могут быть опечатки):
  • Вот пример:

    // 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] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest (). Никаких макросов, никаких уловок, все просто.

    Теперь файл заголовка является необязательным, но его можно использовать для предоставления методов класса 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

    dll
  • Используйте очень маленький класс для объявления вашего модульного теста и переходите от управляемого кода к C ++ / Native, как это (могут быть опечатки):
  • Вот пример:

    // 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] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest (). Никаких макросов, никаких уловок, все просто.

    Теперь файл заголовка является необязательным, но его можно использовать для предоставления методов класса 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

    Вот пример:

    // 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] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest () . Никаких макросов, никаких трюков, все просто.

    Теперь файл заголовка необязателен, но его можно использовать для предоставления методов класса 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

    Вот пример:

    // 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] void NewTest () {:: NewTest ();} и новую нативную функцию void NewTest () . Никаких макросов, никаких трюков, все просто.

    Теперь файл заголовка необязателен, но его можно использовать для предоставления методов класса 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

    весь реальный тест будет выполнен на языке C ++, а класс TestShim будет использоваться для «публикации» теста в MSTest.exe (или сделать его видимым).

    Для добавления новых тестов вы просто объявляете новый [TestMethod] void NewTest () {:: NewTest ();} и новая нативная функция void NewTest (). Никаких макросов, никаких уловок, все просто.

    Теперь файл заголовка является необязательным, но его можно использовать для предоставления методов класса 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

    весь реальный тест будет выполнен на языке C ++, а класс TestShim будет использоваться для «публикации» теста в MSTest.exe (или для его отображения).

    Для добавления новых тестов вы просто объявляете новый [TestMethod] void NewTest () {:: NewTest ();} и новая нативная функция void NewTest (). Никаких макросов, никаких трюков, все просто.

    Теперь файл заголовка необязателен, но его можно использовать для предоставления методов класса 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

    9
    ответ дан 24 November 2019 в 06:34
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: