Ответ
На моих предыдущих проектах на C++ тестирование было распределенной ответственностью по принципу «тестирует тот, кто пишет код».
-
Разработчики (включая меня): Мы были ответственны за модульное (unit) и интеграционное тестирование своего кода. Для этого использовался Google Test (GTest) и Google Mock (GMock). Каждая фича или исправление бага сопровождалось соответствующими тестами.
// Пример unit-теста для класса Parser TEST(ParserTest, ParsesValidInteger) { Parser parser; EXPECT_EQ(parser.parseInt("42"), 42); } TEST(ParserTest, ThrowsOnInvalidInput) { Parser parser; EXPECT_THROW(parser.parseInt("abc"), std::invalid_argument); } - QA-инженеры: Они фокусировались на системном тестировании, регрессионных проверках и тестировании пользовательских сценариев (E2E). Они писали автоматизированные скрипты (часто на Python) для проверки работы всего приложения, а также выполняли ручное исследовательское тестирование.
- Непрерывная интеграция (CI): Вся кодовая база собиралась и прогонялась через полную suite тестов (unit, integration) на сервере CI (например, Jenkins или GitLab CI) при каждом пулл-реквесте. Мерж был возможен только при «зеленом» статусе всех тестов.
Такой подход обеспечивал высокое качество кода и позволял быстро находить регрессии.
Ответ 18+ 🔞
Слушай, вот у нас в прошлых проектах на плюсах с тестированием была простая, но чёткая схема, хуй с горы. Всё строилось на принципе «кто код написал, тот его и тестирует, а то потом разгребать ебушки-воробушки».
-
Мы, разработчики (я в том числе): На нас висело всё модульное и интеграционное тестирование. Инструмент? Google Test (GTest) и Google Mock (GMock), без вариантов. Каждую новую фичу или правку бага ты обязан был закрыть тестами, иначе тебе просто код не замержили, доверия ебать ноль.
// Пример unit-теста для класса Parser TEST(ParserTest, ParsesValidInteger) { Parser parser; EXPECT_EQ(parser.parseInt("42"), 42); } TEST(ParserTest, ThrowsOnInvalidInput) { Parser parser; EXPECT_THROW(parser.parseInt("abc"), std::invalid_argument); }Не написал тест — считай, работу не сделал, иди и доделывай, распиздяй.
-
Ребята из QA: Их зона ответственности — это уже системное тестирование, регрессия и полные пользовательские сценарии (E2E). Они либо автоматизировали это всё на Python, либо вручную всё щупали, как хитрая жопа. Их задача — найти то, что мы, увлёкшись кодом, просрали.
-
Непрерывная интеграция (CI): Вот тут была главная палочка-выручалочка. Каждый пулл-реквест на сервере (Jenkins, GitLab CI — не суть) собирался и гонял ВСЮ пачку тестов — и unit, и integration. Если хоть один тест красный — всё, приехали, мержить нельзя. Пока не починишь — сиди и работай. Система жёсткая, но справедливая, ёпта.
В итоге получалось хоть и напряжно, но чертовски надёжно. Качество кода было на уровне, и если где-то что-то ломалось, мы узнавали об этом почти мгновенно, а не от клиентов, которые уже в ярости.