SlandShow
@SlandShow
70% of my body is made of movies.

Как инициализировать проверяемый объект для google тестов?

Я настроил проект в CLion, подключил модуль от гугл для тестирования.

И я не совсем понимаю как мне тестить объекты?

Например, у меня есть матрица
Вызываю:
#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>

int main(int argc, char* argv[]) {
    // Running Unit-tests
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}


И пытюсь тестить:
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "Matrix.h"

using namespace std;

// A new one of these is created for each test
class VectorTest : public testing::Test
{
public:
    Matrix userMatrix;
    Matrix testMatrix;

    virtual void SetUp() {
        int row;
        int col;

        std::cout << "Enter matrix size (col x row)\n";

        std::cout << "Row:"; std::cin >> row;
        std::cout << "Col:"; std::cin >> col;

        std::cout << "User enter matrix ( " << col << " x " << row << " )\n";

        // Create stack object instance
        userMatrix(col, row);

        std::cout << "Now, let's init matrix:...\n";

        // User input matrix instance
        std::cin >> userMatrix;

        std::cout << "After initialization:\n";
        std::cout << userMatrix;

        testMatrix(col, row);
        std::cout << "Let's init tester matrix\n";
        std::cin >> testMatrix;
        std::cout << "Result of tested matrix initialization \n" << testMatrix;
    }

    virtual void TearDown()
    {
    }
};


Но тут ничего не происходит и пишет, что пройдено 0 тестов (даже не вызываю cout). Как мне правильно тестировать объекты? Использовать моки?
  • Вопрос задан
  • 114 просмотров
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Когда ты хочешь протестировать объект, ты пишешь для него тест.
TEST( TestStaticString, GetChar )
{
	using TestString = Black::StaticString<'A', 'B', 'C'>;

	EXPECT_EQ( 'A', TestString::GetChar( 0 ) );
	EXPECT_EQ( 'B', TestString::GetChar( 1 ) );
	EXPECT_EQ( 'C', TestString::GetChar( 2 ) );
}


Слово TEST - это макрос, раскрывающийся в специальную обвязку твоего теста. Его первый параметр - это имя тестового кейса, второй - имя теста.
Инициализацию тестируемого объекта ты делаешь сам.
Проверки теста производятся с помощью макросов EXPECT_* и ASSERT_*.
Expect не останавливает тест в случае провала, а assert - останавливает. Таким образом можно разделять проверки в тесте на критические (после такой ошибки тест незачем продолжать) и обособленные (тест можно продолжать и получить множество обособленных ошибок).
За деталями можно обратиться к примеру из самих гуглотестов.

Твой класс VectorTest - это фикстура тестов. Применять ее к своим тестам ты можешь с помощью макроса TEST_F. Прочитать про это можно тут.
Фикстуры нужны тогда, когда для группы твоих тестов запуск и остановка являются одинаковыми. В этом случае инициализацию и финализацию тестируемого объекта стоит делать в фикстуре.
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
Тесты своего класса описываешь в TEST_F

class Filter3pTest : public ::testing::Test
{
	using Filter = MedianFilter<short, 3>;
protected:

	void SetUp() override
	{
		f = new Filter();
		EXPECT_NE(f, nullptr);
	}

	void TearDown() override
	{
		delete f;
	}
protected:
	Filter* f = nullptr;
};

TEST_F(Filter3pTest, Base)
{
	EXPECT_NE(f, nullptr);
	auto v = f->Process(10.);
	EXPECT_DOUBLE_EQ(10.,v);
// ...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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