Re: дебагинг vs unit-тесты
От: landerhigh Пират  
Дата: 30.04.16 01:31
Оценка:
Здравствуйте, _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);
www.blinnov.com
Отредактировано 30.04.2016 1:56 landerhigh . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.