Кто занимался тестированием на прошлой работе?

Ответ

На моих предыдущих проектах на C++ тестирование было распределенной ответственностью по принципу «тестирует тот, кто пишет код».

  1. Разработчики (включая меня): Мы были ответственны за модульное (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);
    }
  2. QA-инженеры: Они фокусировались на системном тестировании, регрессионных проверках и тестировании пользовательских сценариев (E2E). Они писали автоматизированные скрипты (часто на Python) для проверки работы всего приложения, а также выполняли ручное исследовательское тестирование.
  3. Непрерывная интеграция (CI): Вся кодовая база собиралась и прогонялась через полную suite тестов (unit, integration) на сервере CI (например, Jenkins или GitLab CI) при каждом пулл-реквесте. Мерж был возможен только при «зеленом» статусе всех тестов.

Такой подход обеспечивал высокое качество кода и позволял быстро находить регрессии.

Ответ 18+ 🔞

Слушай, вот у нас в прошлых проектах на плюсах с тестированием была простая, но чёткая схема, хуй с горы. Всё строилось на принципе «кто код написал, тот его и тестирует, а то потом разгребать ебушки-воробушки».

  1. Мы, разработчики (я в том числе): На нас висело всё модульное и интеграционное тестирование. Инструмент? 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);
    }

    Не написал тест — считай, работу не сделал, иди и доделывай, распиздяй.

  2. Ребята из QA: Их зона ответственности — это уже системное тестирование, регрессия и полные пользовательские сценарии (E2E). Они либо автоматизировали это всё на Python, либо вручную всё щупали, как хитрая жопа. Их задача — найти то, что мы, увлёкшись кодом, просрали.

  3. Непрерывная интеграция (CI): Вот тут была главная палочка-выручалочка. Каждый пулл-реквест на сервере (Jenkins, GitLab CI — не суть) собирался и гонял ВСЮ пачку тестов — и unit, и integration. Если хоть один тест красный — всё, приехали, мержить нельзя. Пока не починишь — сиди и работай. Система жёсткая, но справедливая, ёпта.

В итоге получалось хоть и напряжно, но чертовски надёжно. Качество кода было на уровне, и если где-то что-то ломалось, мы узнавали об этом почти мгновенно, а не от клиентов, которые уже в ярости.