От: | _hum_ | ||
Дата: | 29.04.16 13:33 | ||
Оценка: | +2 |
текст | |
L>Разраб: так, что у нас тут в беклоге вниманием обделено? О! Поддержка формата времени протокола (страшная аббривеатура) в сетевом модуле. L>Разраб: Ага, понятно, наконец-то мы будет показывать настоящее время, а не забивать его <unknown>. Так, где у нас спецификация... L>(5 минут) L>Разраб: Я хочу того же, что курили аффтфры спецификации протокола. Открывает Wireshark и выдергивает из сетевой сессии с прибором сообщения, содержащие оные типы. В случае отсутствия прибора или wireshark'a изобретает Hex-dump нужного PDU самостоятельно или заимствует его из спецификации, если аффтары озаботились примерами. В процессе придумывает забавные примеры невалидного элемента. Добавляет в протокола поддержку нового типа, а в проект юнит-тестов — проверку работы парсера, используюя награбленные или придуманные сырые данные. Не забывает тест, в котором на вход парсера подается мусор или специально инвалидированные данные. Щелкает "билд" на юнит-тест проекте. Оный собирает измененную либу парсера протокола, собирается сам и запускается. В консоли — 2 failed tests, которые разработчик нарочно зафейлил, чтобы проверить сам себя. Исправляет проваленные тесты, добавляет новые для граничных условий и обнаруженных серых пятен в спецификации, перезапускает билд. Через 5 минут — XXX tests passed. L>В итоге — полностью реализовананя новая функциональность, покрытая тестами и даже в некоторых случаях прошедшая regression — ранее написанные тесты покажут, если новая функциональность вносит breaking change. Причем, за время, которого не хватило бы на полную сборку проекта и хотя бы один ручной тестовый прогон. Причем, проект автоматически прогоняет даже такие условия, которые во время ручного теста проверить невозможно. | |
L> Matrix transpose(const Matrix& original);
L>
L> TEST(transposeMatrix, transposeNegative)
L> {
L> // this is more a border case test
L> ASSERT_TRUE(transpose(emptyMatrix).empty()); // Also checks that we don't crash if matrix is empty
L> }
L> TEST(transposeMatrix, transposePositiveSymmetrical)
L> {
L> Matrix symmetricalMatrix = ...; // Initialize
L> Matrix expected = ...; // Manually transposed matrix
L> ASSERT_EQ(expected, transpose(symmetricalMatrix));
L> ASSERT_EQ(symmetricalMatrix, transpose(transpose(symmetricalMatrix)));
L> }
L> TEST(transposeMatrix, transposePositiveAsymmetrical)
L> {
L> Matrix asymmetricalMatrix = ...; // Initialize
L> Matrix expected = ...; // Manually transposed matrix
L> ASSERT_EQ(expected, transpose(asymmetricalMatrix ));
L> ASSERT_EQ(asymmetricalMatrix , transpose(transpose(asymmetricalMatrix )));
L> }
L>