Написание и тестирование функций может быть похоже на бег в колесе хомяка — вы продолжаете двигаться, но ничего не достигаете. В этом нет ничего постыдного; каждый разработчик знает эту борьбу. Но что, если мы скажем вам, что теперь есть способ ускорить весь процесс? Обычно мы обращаемся к тестированию кода, модульной разработке и модульному тестированию, чтобы убедиться, что наша функция работает так, как задумано. Но что, если бы существовал еще лучший способ сделать это?

Следующее слово в вашей голове, скорее всего, будет GPT-4 от OpenAI, последней версии серии GPT. Могу ли я перенести свою работу в GPT-4, и будет ли она иметь красивую, но слепо неработающую реализацию? Кажется, есть способ гарантировать, что даже если он сломан, вы сможете быстро обнаружить и исправить это (да, быстро ly 😆).

Суть в том, чтобы ничего не тестировать самостоятельно, а попросить GPT-4 написать свои собственные тестовые примеры и тестовый код, внедряя микротестирование ИИ. Все, что вам нужно сделать, это проверить на глаз, включены ли ВСЕ случаи использования/тестирования, и вернуть результаты, которые имеют смысл. Вот как вы можете использовать GPT-4 для создания и тестирования функций на любом языке программирования. Для нашего примера давайте сделаем JavaScript.

Создание функции compareUrls

Для краткости я думал написать функцию на JavaScript, которая сравнивает два URL с параметрами запроса. Вот что я побудил GPT-4 сделать:

Create a function in JavaScript that takes two URLs with query parameters and returns true if they are the same, otherwise false.

Затем GPT-4 сгенерирует для вас некоторый код JavaScript следующим образом:

function compareUrls(url1, url2) {
  const searchParams1 = new URLSearchParams(url1.split('?')[1]);
  const searchParams2 = new URLSearchParams(url2.split('?')[1]);
  
  if (searchParams1.toString() !== searchParams2.toString()) {
    return false;
  }
  
  const baseURL1 = url1.split('?')[0];
  const baseURL2 = url2.split('?')[0];
  
  if (baseURL1 !== baseURL2) {
    return false;
  }
  
  return true;
}

Опять же, слепая оценка на глаз скажет вам, что это код LGTM, как и обычные ловушки разработчиков. Но мы не можем быть уверены, не взглянув поближе или не создав для этого некоторые модульные тесты. Давайте попробуем нашу технику микротестирования ИИ.

Тестирование вашей функции

После получения кода, сгенерированного GPT-4, вы можете вручную проверить свою функцию, чтобы убедиться в ее правильности, или вы можете предложить GPT-4 создать некоторые (надеюсь, все) тестовые случаи со следующим запросом:

Write all possible test cases as simple function calls.

Вот несколько тестовых случаев, которые предоставляет GPT-4, чтобы определить, работает ли функция должным образом:

compareUrls(
    'https://example.com/page?param1=foo',
    'https://example.com/page?param1=foo'
); // Returns true

compareUrls(
    'https://example.com/page?param1=foo',
    'https://example.com/page?param1=bar'
); // Returns false

compareUrls(
    'https://example.com/page?param1=foo&param2=bar',
    'https://example.com/page?param1=foo&param2=bar'
); // Returns true

compareUrls(
    'https://example.com/page?param1=foo&param2=bar',
    'https://example.com/page?param1=foo&param2=baz'
); // Returns false

compareUrls(
    'https://example.com/page?param1=foo&param2=bar',
    'https://example.com/different_page?param1=foo&param2=bar'
); // Returns false

compareUrls(
    'https://example.com/page?param1=foo&param2=bar&a=b',
    'https://example.com/page?a=b&param1=foo&param2=bar'
); // Returns true

Проверяя, возвращает ли compareUrls то, что ожидается, вы можете оценить правильность и охват функции. Вывод на консоль логического выражения, сравнивающего результаты compareUrls с ожидаемым значением, также может быть очень полезным, например:

console.log(
  compareUrls(
    'https://example.com/page?param1=foo',
    'https://example.com/page?param1=foo'
  ) === true
)

Чтобы еще больше автоматизировать это, попросите GPT-4 заключить их в итерацию массива, чтобы проверить, возвращает ли каждый вызов функции ожидаемое значение.

Enclose these in an array and iterate through them to check that every function call returns the expected value.
const testCases = [
  ['https://example.com/page?param1=foo', 'https://example.com/page?param1=foo', true],
  ['https://example.com/page?param1=foo', 'https://example.com/page?param1=bar', false],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/page?param1=foo&param2=bar', true],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/page?param1=foo&param2=baz', false],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/different_page?param1=foo&param2=bar', false],
  ['https://example.com/page?param1=foo&param2=bar&a=b', 'https://example.com/page?a=b&param1=foo&param2=bar', true]
];

const results = testCases.map(testCase => compareUrls(testCase[0], testCase[1]) === testCase[2]);

const allAreTrue = results.every(result => result === true);

console.log(allAreTrue, results);

Если хотя бы один результат микротеста ложный, код не обрабатывает один или несколько тестовых случаев. В данном конкретном случае есть две проблемы:

  1. Сравнение URL-адреса с параметрами с URL-адресом без параметров будет работать некорректно, и
  2. Последний вариант использования возвращает false, потому что это не обрабатывается исходным черновиком функции.

Итак, мы должны вернуться к GPT-4 с обратной связью, задав что-то вроде этого:

What if you compare a url which does not have query parameters with another that does? Also, the last use case is returning false, so that is not being handled correctly by the code apparently. The urls should be considered equal, regardless of the order of params, as long as they have the same value. Can you fix it?

Теперь GPT-4 возвращает (надеюсь) окончательную версию, которая подходит для большинства вариантов использования. Хоть это решение и не обеспечивает обработку ошибок, но ничего такого, с чем бы не справились некоторые подсказки TypeScript и GPT-4.

Окончательная реализация CompareUrls и микротестирование ИИ

function compareUrls(url1, url2) {
  const searchParams1 = new URLSearchParams(url1.split('?')[1]);
  const searchParams2 = new URLSearchParams(url2.split('?')[1]);
  
  const allKeys = new Set([...searchParams1.keys(), ...searchParams2.keys()]);
  
  for (const key of allKeys) {
    const values1 = searchParams1.getAll(key).join(',');
    const values2 = searchParams2.getAll(key).join(',');
    
    if (values1 !== values2) {
      return false;
    }
  }
  
  const baseURL1 = url1.split('?')[0];
  const baseURL2 = url2.split('?')[0];
  
  if (baseURL1 !== baseURL2) {
    return false;
  }
  
  return true;
}

const testCases = [
  ['https://example.com/page', 'https://example.com/page', true],
  ['https://example.com/page', 'https://example.com/page?param1=foo', false],
  ['https://example.com/page?param1=foo', 'https://example.com/page?param1=foo', true],
  ['https://example.com/page?param1=foo', 'https://example.com/page?param1=bar', false],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/page?param1=foo&param2=bar', true],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/page?param1=foo&param2=baz', false],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/different_page?param1=foo&param2=bar', false],
  ['https://example.com/page?param1=foo&param2=bar&a=b', 'https://example.com/page?a=b&param2=bar&param1=foo', true],
  ['https://example.com/page?param1=foo&param2=bar', 'https://example.com/page?param2=bar&param1=foo', true]
];

const results = testCases.map(testCase => compareUrls(testCase[0], testCase[1]) === testCase[2]);

const allAreTrue = results.every(result => result === true);

console.log(allAreTrue, results);

Итак, кодирование с микротестированием ИИ?

Использование GPT-4 для создания и тестирования ваших функций имеет некоторые преимущества:

  1. Более быстрая реализация: GPT-4 генерирует код для вас, что делает процесс реализации быстрее и эффективнее.
  2. Лучшее качество кода: GPT-4 обеспечивает всестороннее тестовое покрытие, что приводит к более стабильной и хорошо протестированной кодовой базе, если это будет предложено соответствующим образом.
  3. Экономит время: разработчики могут использовать GPT-4, чтобы сэкономить время на создании тестовых случаев, что позволяет им сосредоточиться на других аспектах процесса разработки. GPT-4 поможет вам с первыми ошибочными черновиками, которые обычно занимают больше всего времени, чтобы начать разработку.
  4. Итеративное улучшение. Цикл обратной связи с GPT-4 позволяет итеративно улучшать код и тестовые примеры, уточняя подсказки.

Модульная разработка и модульное тестирование являются важнейшими методами повышения качества вашего программного обеспечения, и, что удивительно, несмотря на все ограничения GPT-4, существует несколько безопасный способ повысить эффективность. Тем не менее, нам все еще нужно следить за тем, что эти бомбы GPT-4 могут быть более разрушительными, чем человеческие жуки, если им слепо доверять.

Если вы работаете с программным обеспечением, вы знаете, насколько важно убедиться, что все сделано правильно. Вот где пригодятся модульная разработка и модульное тестирование. Тем не менее, это боль, и даже когда вы все делаете правильно, что-то все равно может просочиться. GPT-4 от OpenAI может сделать вашу жизнь проще, но не без проблем. Можем ли мы доверять машине? Это лучше, чем человеческая ошибка? Не всегда.

Слушайте, GPT-4 полезен, в этом нет сомнений. Это может помочь вам создавать и тестировать функции лучше и эффективнее. Это как толчок кофеина для ваших процессов. Не нужно его приукрашивать. Но это не идеально, и без острого взгляда это может даже усугубить ситуацию.

Итак, вам решать, стоит ли попробовать GPT-4 или нет. Но если вы это сделаете, вы можете обнаружить, что это может сделать вашу разработку программного обеспечения более точной и эффективной. Просто не забывайте, что за каждой серебряной подкладкой приходит облако, а в технологиях каждый шаг вперед означает появление новых проблем, на которые нужно обратить внимание. Поэтому не забудьте включить все тестовые примеры и проверить их самостоятельно перед отправкой в ​​производство!