Головна / Статті / Сім open-source інструментів для перевірки ШІ-коду перед продакшеном

Сім open-source інструментів для перевірки ШІ-коду перед продакшеном

Сім проєктів із GitHub, від мутаційного тестування до навантажувальних тестів, які перевіряють якість тестів, витоки секретів, залежності, доступність і швидкість застосунків, написаних ШІ.

941 слів

Ваш асистент для коду повідомляє, що робота готова, тести зелені, а застосунок працює в прев'ю. Здається, що справу зроблено. Зазвичай це не так.

Зелений прогін тестів доводить лише те, що тести пройшли. Чи впали б ці тести на зламаній реалізації — окреме питання. Як і кілька інших: чи не прослизнув у коміт якийсь ключ, чи немає в підтягнутих пакетах відомих дір і що буде, якщо застосунок одночасно відкриють п'ятдесят людей? Сам асистент на такі питання рідко відповідає.

Ці прогалини закривають сім open-source інструментів, і кожен дивиться зі свого боку: надійність тестів, секрети, що витекли, вразливі залежності, патерни в коді, мертвий код, доступність і навантаження. Кілька з них націлені на JavaScript і TypeScript, тому особливо добре пасують до вебзастосунків, створених ШІ. Проженіть їх до того, як будь-що потрапить у продакшен.

StrykerJS: а ваші тести взагалі кусаються?

StrykerJS — фреймворк мутаційного тестування для JavaScript і TypeScript. Він вносить у вихідний код дрібні навмисні зміни, наприклад перевертає порівняння чи видаляє оператор, і щоразу заново запускає набір тестів. Якщо після зміни всі тести, як і раніше, проходять, у набору є сліпа пляма. Відсотки покриття цього не покажуть, бо рядок може виконуватися, але так жодного разу й не перевірятися.

На невеликому проєкті його можна спробувати одразу:

pnpm add --save-dev @stryker-mutator/core
# Only for small projects:
npx stryker run

Без конфігурації він використовує розумні значення за замовчуванням: запускає npm test як команду тестів і шукає код для мутацій у lib і src.

Gitleaks: ловіть секрети заздалегідь

Gitleaks сканує файли й історію Git у пошуках облікових даних на кшталт API-ключів і токенів. Його можна запускати вручну або вбудувати в автоматичний пайплайн, і тоді ключ, що витік, зупинять до того, як він розійдеться клонами й форками. Згенерований код — часте джерело цієї проблеми, адже модель охоче вставляє ключ-заглушку, який потім виявляється справжнім.

Щоб завантажити й зібрати його:

git clone https://github.com/gitleaks/gitleaks.git
cd gitleaks
make build

OSV-Scanner: знайте, від чого ви залежите

OSV-Scanner звіряє пакети з ваших lock-файлів із базою вразливостей OSV. Він повідомляє, для яких саме ваших версій опубліковано попередження, і дає конкретну картину ризику, який приносять залежності. Асистенти часто додають бібліотеки не замислюючись, тож ця перевірка швидко окуповується.

Зібрати його можна за допомогою Go:

go install github.com/google/osv-scanner/v2/cmd/osv-scanner@latest

Semgrep: статичний аналіз за правилами

Semgrep — швидкий open-source статичний аналізатор. Він шукає патерни в коді, щоб знаходити баги, позначати небезпечні конструкції й стежити за дотриманням домовленостей команди. Він розуміє понад тридцять мов і працює в редакторі, як pre-commit хук або всередині задачі CI/CD.

Встановлюється через pip:

 python3 -m pip install semgrep

Knip: видаліть те, чим ніхто не користується

Knip знаходить у проєктах на JavaScript і TypeScript файли, залежності й експорти, на які ніщо не посилається. У згенерованому коді залишки накопичуються швидко: покинуті хелпери, пакети, які додали й так і не імпортували. Їхнє чищення зменшує навантаження на супровід і робить репозиторій читабельнішим у міру його зростання.

axe-core: перевірки доступності

axe-core — рушій для тестування доступності вебсторінок та інших інтерфейсів на HTML. Він швидкий і легкий і підключається до будь-якої тестової зв'язки, яка у вас уже є, тож перевірки доступності можуть стояти поруч зі звичайними функціональними. Асистенти схильні видавати розмітку, яка виглядає правильно, але в ній бракує міток, ролей і контрасту, і саме так ви це помітите.

k6: як воно поводиться під навантаженням?

k6 — інструмент навантажувального тестування. Ви описуєте сценарії в коді, вимірюєте час відповіді й частку помилок і задаєте пороги, які автоматично валять прогін, якщо продуктивність просідає. Невеликий приклад:

import http from "k6/http";
import { check, sleep } from "k6";

// Test configuration
export const options = {
  thresholds: {
    // Assert that 99% of requests finish within 3000ms.
    http_req_duration: ["p(99) < 3000"],
  },
  // Ramp the number of virtual users up and down
  stages: [
    { duration: "30s", target: 15 },
    { duration: "1m", target: 15 },
    { duration: "20s", target: 0 },
  ],
};

// Simulated user behavior
export default function () {
  let res = http.get("https://quickpizza.grafana.com");
  // Validate response status
  check(res, { "status was 200": (r) => r.status == 200 });
  sleep(1);
}

Скрипт імітує десять віртуальних користувачів протягом тридцяти секунд, і кожен робить паузу в секунду між запитами. Його пороги вимагають, щоб 95-й перцентиль часу відповіді лишався нижче 500 мс, а невдалих запитів було менше 1%.

Збережіть файл як test.js, встановіть k6 і запустіть його командою k6 run test.js.

Збираємо все докупи

Жоден із цих інструментів не доводить, що ваш застосунок коректний, і не мусить. Разом вони закривають питання, які пропускає успішне демо. Почніть із Gitleaks і OSV-Scanner: вони займають хвилини й ловлять найдорожчі помилки. Потім додайте Stryker і Semgrep для перевірки самого коду, Knip для його чищення, axe-core для доступності й k6 для трафіку. Якщо до вашого власного чек-листа проситься інший open-source інструмент, додайте його. Мета щоразу одна: довіряйте результату лише після того, як щось спробувало його зламати.