Тестирование на утверждает в Среде тестирования Повышения

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

20
задан manlio 5 March 2014 в 09:11
поделиться

5 ответов

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

6
ответ дан 30 November 2019 в 00:23
поделиться

Извините, но Вы принимаетесь за решение своей проблемы неправильный путь.

"утверждают", икра дьявола (иначе "C") и бесполезна с любым языком, который имеет надлежащие исключения. Это - waaaaaay лучше для перереализации как будто утверждать функциональности за исключениями. Таким образом, Вы на самом деле получаете шанс ошибок из-за неправильного обращения правильный путь (incl надлежащие процедуры очистки) или инициирование их по желанию (для поблочного тестирования).

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

Так делают себе одолжение и повторно кодируют утверждать функцию, которая выдает исключения. Здесь существует тот: , Как я могу утверждать (), не используя аварийное прекращение работы ()?

Переносят его в макрос, таким образом, Вы добираетесь _ _FILE _ _ и _ _ СТРОКА _ _ (полезный для отладки), и Вы сделаны.

0
ответ дан 30 November 2019 в 00:23
поделиться

I think this question, and some of replies, confuse run-time errors detection with bug detection. They also confuse intent and mechanism.

Run-time error is something that can happen in a 100% correct program. It need detection, and it needs proper reporting and handling, and it should be tested. Bugs also happen, and for programmer's convenience it's better to catch them early using precondition checks or invariant checks or random assert. But this is programmer's tool. The error message will make no sense for ordinary user, and it does not seem reasonable to test function behaviour on the data that properly written program will never pass to it.

As for intent and mechanism, it should be noted that exception is nothing magic. Some time ago, Peter Dimov said on Boost mailing list (approximately) that "exceptions are just non-local jump mechanism". And this is very true. If you have application where it's possible to continue after some internal error, without the risk that something will be corrupted before repair, you can implement custom assert that throws C++ exception. But it would not change the intent, and won't make testing for asserts much more reasonable.

3
ответ дан 30 November 2019 в 00:23
поделиться

Мне нравится проверять два типа ошибок: инварианты и ошибки времени выполнения.

Инварианты - это вещи, которые всегда должны быть верными, несмотря ни на что. Для них я использую утверждения. Такие вещи, как вы, не должны передавать мне нулевой указатель на выходной буфер, который вы мне даете. Это ошибка в коде, простая и понятная. В отладочной сборке он подтвердит и даст мне возможность исправить это. В розничной сборке это вызовет нарушение прав доступа и сгенерирует минидамп (Windows, по крайней мере, в моем коде) или coredump (Mac / unix). Нет никакого улова , которое я могу сделать, чтобы иметь дело с разыменованием нулевого указателя. В Windows catch (...) может подавлять нарушения доступа и давать пользователю ложное чувство уверенности в том, что все в порядке, когда они уже пошли ужасно, ужасно неправильно.

Это одна из причин, по которой я пришел к выводу, что catch (...) - это вообще запах кода на C ++ и единственное разумное место, где я могу думать об этом присутствии находится в main (или WinMain ) прямо перед тем, как вы создадите дамп ядра и вежливо закроете приложение.

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

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

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

9
ответ дан 30 November 2019 в 00:23
поделиться

Имея ту же проблему, я покопался в документации (и коде) и нашел "решение".

Boost UTF использует boost :: execution_monitor ). Это сделано с целью поймать все, что могло произойти во время выполнения теста. Когда найдено утверждение Execution_monitor перехватывает его и генерирует boost :: execution_exception . Таким образом, используя BOOST_REQUIRE_THROW , вы можете заявить об ошибке утверждения.

так:

#include <boost/test/unit_test.hpp>
#include <boost/test/execution_monitor.hpp>  // for execution_exception

BOOST_AUTO_TEST_CASE(case_1)
{
  BOOST_REQUIRE_THROW(function_w_failing_assert(),
                      boost::execution_exception);
}

Должен сработать. (Это работает для меня.)

Однако (или отказ от ответственности):

  • Это работает для меня. То есть в Windows XP MSVC 7.1 форс 1.41.0. Это могло бы быть неподходящими или сломанными в вашей установке.

  • Возможно, это не входило в намерения автора Boost Test. (хотя кажется, что это цель Execution_monitor.)

  • Он будет обрабатывать все формы фатальных ошибок одинаково. Я е это могло быть что что-то другое, кроме вашего утверждения, не работает. В этом случае вы может пропустить ошибку повреждения памяти ega и / или пропустить неудачное неудачное утверждение.

  • Это может выйти из строя в будущих версиях boost.

  • Я ожидаю, что он потерпит неудачу, если будет запущен в конфигурации выпуска, так как assert будет отключен, а код, который был установлен для assert, не будет запустить. Это приводит к очень неопределенному поведению.

  • Если в конфигурации Release для msvc возникает некоторая ошибка типа assert или другая фатальная ошибка все равно произошло бы не было бы поймано. (см. документацию Execution_monitor.)

  • Используете ли вы assert или нет - решать вам. Мне они нравятся.

См .:

Также спасибо Геннадию Розенталу (автору Boost Test), если вы прочтите это, отличная работа !!

13
ответ дан 30 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: