Информация об изменениях

Сообщение Re: дебагинг vs unit-тесты от 30.04.2016 1:31

Изменено 30.04.2016 1:56 landerhigh

Здравствуйте, _hum_, Вы писали:

__>так а где здесь код-то самого транспонирования?


Он не нужен. Нужен код тестов.

__>ведь ошибки именно там кроются. и если вы увидите срабатывание ассертов, что делать дальше будете?


Покупать акции Газпрома, а что еще можно сделать?
Разбираться, конечно же, в причинах срабатывания ассертов.

__>как, например, обнаружите глупейшую ошибку типа Matrix[i][j] = Matrix[j][i] для in-place трансполнирования квадратной матрицы?


Вы не поверите...
Предположим, что у нас и правда завелась функция

void transposeInPlace(Matrix& mtx);


пишем тест для нее. Естественно, предполагается, что у нас есть оператор сравнения двух матриц.

TEST(transposeMatrix, inPlace)
{
    Matrix mtx = {1 2 3
              4 5 6
                      7 8 9};    // Псевдокод, вестимо
    Matrix expected = {1 4 7
               2 5 8
                           3 6 9}; // Транспонировали вручную, на клочке бумажки
    transposeInPlace(mtx);
    ASSERT_EQ(expected, mtx);  // Глупая ошибка не пройдет


Кстати, сигнатура

Matrix transpose(const Matrix& original);


подразумевает, что явного in-place транспонирования не предусмотрено. RVO тоже не сделает это транспонирование in-place, но мы все слышали про странные глюки в компиляторах, поэтому придумаем такое, чисто для очистки совести

TEST(transposeMatrix, testThatShouldNotExist)
{
    Matrix mtx = ...; // Тут инициализация квадратной матрицы
    Matrix expected = ...; // Вручную инициализированная транспонированная матрица
    mtx = transpose(mtx);
    ASSERT_EQ(expected, mtx);
Re: дебагинг vs unit-тесты
Здравствуйте, _hum_, Вы писали:

__>так а где здесь код-то самого транспонирования?


Он не нужен. Нужен код тестов.

__>ведь ошибки именно там кроются. и если вы увидите срабатывание ассертов, что делать дальше будете?


Покупать акции Газпрома, а что еще можно сделать?
Разбираться, конечно же, в причинах срабатывания ассертов.

__>как, например, обнаружите глупейшую ошибку типа Matrix[i][j] = Matrix[j][i] для in-place трансполнирования квадратной матрицы?


Вы не поверите...
Предположим, что у нас и правда завелась функция

void transposeInPlace(Matrix& mtx);


пишем тест для нее. Естественно, предполагается, что у нас есть оператор сравнения двух матриц.

TEST(transposeMatrix, inPlace)
{
    Matrix mtx = 
        {1 2 3
        4 5 6
        7 8 9};    // Псевдокод, вестимо
    Matrix expected = 
        {1 4 7
        2 5 8
        3 6 9}; // Транспонировали вручную, на клочке бумажки
    transposeInPlace(mtx);
    ASSERT_EQ(expected, mtx);  // Глупая ошибка не пройдет


Кстати, сигнатура

Matrix transpose(const Matrix& original);


подразумевает, что явного in-place транспонирования не предусмотрено. RVO тоже не сделает это транспонирование in-place, но мы все слышали про странные глюки в компиляторах, поэтому придумаем такое, чисто для очистки совести

TEST(transposeMatrix, testThatShouldNotExist)
{
    Matrix mtx = ...; // Тут инициализация квадратной матрицы
    Matrix expected = ...; // Вручную инициализированная транспонированная матрица
    mtx = transpose(mtx);
    ASSERT_EQ(expected, mtx);