Ответ
На моих предыдущих проектах на 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) при каждом пулл-реквесте. Мерж был возможен только при «зеленом» статусе всех тестов.
Такой подход обеспечивал высокое качество кода и позволял быстро находить регрессии.