Правильное использование assert - PullRequest
2 голосов
/ 03 декабря 2010

Не могли бы вы помочь мне лучше понять, как правильно использовать «assert» против «выброса исключения»? Когда каждый сценарий уместен?

Сценарий 1

код

public Context(Algorythm algo) {
  if (algo == null) {
      throw new IllegalArgumentException("Failed to initialize Context");
  }
  this.algo = algo;
}

TEST

public void testContext_null() {
  try {
      context = new Context(null);
      fail();
  } catch (IllegalArgumentException e) {
      assertNotNull(e);
  }
}

Сценарий 2

код

public Context(Algorythm algo) {
  assert (algo != null);
  this.algo = algo;
}

TEST

public void testContext_null() {
  try {
      context = new Context(null);
      fail();
  } catch (AssertionFailedError e) {
      assertNotNull(e);
  }
}

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Основным отличием от assert является:

  • возможность включения / выключения выбранных тестов по классу / пакету.
  • выданная ошибка.

assert больше подходит для тестов, которые будут отключены в производственном процессе.

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

1 голос
/ 03 декабря 2010

Assert - это макрос (в C / C ++ или функция в других языках), который проверяет заданное выражение как true или false и выдает исключение в случае ложных значений.

Assert - это то, что нужно использовать при отладке приложения, например, когда вы должны проверить, действительно ли математическое выражение дает вам подходящее значение, или член объекта / структуры не равен нулю или отсутствует что-то важное, и тому подобное.

Исключение - это скорее настоящая обработка ошибок. Исключения также являются ошибками и могут остановить ваше приложение, но они используются в качестве (скажем, «розничной версии» обработки ошибок приложения). Это связано с тем, что исключения могут быть перехвачены и восприняты пользователем по-разному, с небольшим нетехническим сообщением вместо символов и адресов памяти, а вы, например, можете просто сериализовать это в журнал приложения.

С другой стороны, утверждения просто остановят запущенный процесс и сообщат вам следующее сообщение: «Ошибка подтверждения в source_file.ext, строка X. Процесс будет завершен». И это не удобно для пользователя:)

0 голосов
/ 03 декабря 2010

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

  1. дополнительные, возможно, медленные тесты, которые будут отключены при производстве
  2. нормальные, быстрые тесты исправности кода, которые никогда не следует отключать (например, требующиеданный параметр метода должен быть ненулевым)

Пока вы всегда следуете одному из сценариев, все в порядке.однако, если ваша кодовая база заканчивается обоими сценариями, то вы застряли.у вас есть утверждения, которые следуют сценарию 2, которые вы не хотите отключать, и у вас есть утверждения, которые следуют сценарию 1 (и замедляют рабочий код), которые вы хотите отключить.Что делать?

Большинство кодовых баз, с которыми я работал, которые использовали утверждения в обычном коде, никогда не заканчивали тем, что отключали их в производственной сборке именно по этой причине.поэтому я всегда рекомендую избегать их вне тестового кода.используйте нормальные исключения для нормального кода и вставьте дополнительный, возможно, медленный код (с утверждениями) в отдельный тестовый код.

0 голосов
/ 03 декабря 2010

Ключевое слово assert следует использовать, когда невыполнение условия нарушает целостность программы.Они предназначены для невосстановимых ошибок.

Исключения, с другой стороны, предупреждают методы вызова о наличии и местонахождении ошибки, но могут обрабатываться или игнорироваться по усмотрению программиста.1004 * При тестировании следует использовать функции Assert, если для выполнения теста необходимо выполнить условие.Если вы ожидаете исключения в этом конкретном тесте, JUnit 4 имеет аннотацию, указывающую, что тест должен выдать конкретное исключение:

@Test(expected=MyException.class)
...