Как написать модульный тест для проверки ошибки компиляции? - PullRequest
2 голосов
/ 21 ноября 2010

Я пытаюсь написать тест для проверки ошибки компиляции.Речь идет о присвоении номера свойству типа String.Но так как это ошибка компиляции, код модульного теста даже не будет компилироваться с самого начала.Так что у кого-нибудь есть какие-либо предложения о том, как это сделать?

Я думаю, может быть, я смогу присвоить номер во время выполнения и проверить, не было ли выброшено определенное исключение?Но я не уверен, как именно это сделать.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 21 ноября 2010

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

Вы не указали язык программирования, поэтому я сделаю некоторый псевдокод. Допустим, вы пишете функцию для добавления двух чисел:

function add(a, b) {
   return a + b;
}

Очень просто. Вы должны проверить это, например, выполняя тесты как ниже:

function testAdd() {
   assertEquals(4, add(2, 2));
   assertEquals(46, add(12, 34));
}

Однако вы должны не написать тест, который проверяет, нормально ли работает оператор +. Это работа того, кто написал библиотеку, которая реализует, как действительно работает оператор +.

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

1 голос
/ 02 августа 2015

Вы не указали язык

  • Ruby, Python - динамическая и сильная система типов.Это означает, что типы, выводимые во время выполнения (динамические), но неявные преобразования между типами запрещены
  • Js, Perl - динамическая и слабая система типов.
  • C ++ - статическая и сильная система типов.

Предположим, мы говорим о C ++.Более того, я могу создать более реальный пример.Представьте, что вы реализуете static assert для своего проекта, который не использует компилятор c ++ 11

template <bool>
struct my_static_assert;

template <>
struct my_static_assert<true> {};

Если вы хотите проверить, работает ли такой механизмХорошо.Вы должны создать функцию unittest, которая выполняет следующие шаги:

  1. Создать файл для компилятора

  2. Создать внешний процесс компилятора и пройти тестовую компиляциюединица измерения

  3. Ожидание завершения процесса компиляции
  4. Извлечение кода возврата из процесса компиляции
  5. Ваша функция проверяет код возврата с 4.

Я проверил руководство по google-test, но похоже, что они не поддерживают такую ​​концепцию https://github.com/google/googletest/blob/master/googletest/docs/advanced.md

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...