Установите и разъедините сложного состояния базы данных с, в спящем режиме / Spring / JUnit

... имеет оптимальную длину для HD = 3 и хорошую производительность HD = 2 выше этой длины.

blockquote>

Заявление плохо сформулировано. Я нахожу его в нижней части этой веб-страницы под «Обозначение:»

https://users.ece.cmu.edu/~koopman/crc

В В этой и других статьях, которые я нахожу, аббревиатура «HD» представляет минимальное расстояние Хэмминга для CRC: для HD = k + 1, CRC может обнаруживать любой шаблон из k битовых ошибок в сообщении вплоть до некоторой длины (как показано в столы). Как вы заявили, «все CRC имеют бесконечную длину данных при HD = 2».

Использование фразы «хорошая производительность HD = 2 выше этой длины» сбивает с толку. Веб-сайт выше ссылается на веб-сайт ниже, который включает в себя утверждение «Длина HD = 2 всегда бесконечна и поэтому всегда исключается из этого списка».

https: //users.ece .cmu.edu / ~ koopman / crc / notes.html


Расстояние вики Хемминга объясняет взаимосвязь между обнаружением битовых ошибок и расстоянием Хемминга: «код C называется обнаружением ошибок k, если и только если минимальное расстояние Хэмминга между любыми двумя из его кодовых слов составляет не менее k + 1. «Как вы сказали,« все CRC имеют бесконечную длину данных при HD = 2 », то есть все CRC могут обнаружить любую ошибку в одном бите независимо от длины сообщения.

Что касается «оптимальной длины для HD = 3», что означает возможность обнаружения 2-битной ошибки, рассмотрим регистр сдвига с линейной обратной связью на основе полинома CRC, инициализированный любым не -нулевое значение, если вы будете циклически повторять регистр достаточно времени, он вернется к исходному значению. Для n-битовой CRC, основанной на n + 1-битном примитивном полиноме, регистр будет циклически перебирать все 2 ^ n - 1 ненулевых значений перед повторением. Максимальная длина сообщения (то есть длина данных плюс длина CRC), при которой невозможно обнаружить 2-битную ошибку, составляет 2 ^ n - 1. Для сообщения длиной 2 ^ n или больше, тогда для любое «i», если бит [0 + i] и бит [(2 ^ n) -1 + i] имеют ошибку, примитивный CRC не сможет обнаружить 2-битную ошибку. Если полином CRC не является примитивным, максимальная длина для отказоустойчивого обнаружения 2 битов будет уменьшена, а не "оптимальной".

Для регистра сдвига с линейной обратной связью, основанного на любом полиноме CRC, инициализированном любым ненулевым значением, независимо от того, сколько раз он его зацикливал, он никогда не будет содержать значение ноль. Это один из способов объяснить, почему «все CRC имеют бесконечную длину данных при HD = 2» (способны обнаруживать однобитовые ошибки).

9
задан Brian Ferris 5 May 2009 в 01:01
поделиться

7 ответов

Вы застряли с конкретным поставщиком базы данных? Если нет, вы можете использовать базу данных в памяти, например HSQLDB . Когда вы закончите с тестами, вы просто выбрасываете состояние. Это уместно только в том случае, если таблицы могут быть пустыми в начале набора тестов (то есть перед вашей программной настройкой).

Вам все равно нужно создавать таблицы, но если все аккуратно отображено с помощью Hibernate, вы можете использовать hbm2ddl для создания ваших таблиц. Все, что вам нужно сделать, это добавить следующее в определение фабрики сеансов test :

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

Если это решение кажется применимым, я могу его более подробно рассказать.

7
ответ дан 4 December 2019 в 23:07
поделиться

Одним из решений, которое вы можете рассмотреть, является использование «ручного» отката или компенсирующей транзакции в db teardown. Я полагаю (а если нет, то это должно быть тривиальное дополнение к вашим объектам Hibernate), все ваши объекты имеют атрибут datetime create, указывающий, когда они были ВСТАВЛЕНЫ в таблицу. Ваш метод настройки БД должен записывать время раньше, чем все остальное. Тогда у вас есть довольно простая процедура для удаления базы данных, чтобы удалить все сущности, которые были созданы после времени, записанного в настройке базы данных.

Конечно, это не будет работать для обновлений в настройке БД ... Но если у вас ограниченное количество обновлений, подумайте о сохранении нетронутого образа для этого типа данных и восстановите его во время удаления БД.

0
ответ дан 4 December 2019 в 23:07
поделиться

Если вы работаете с относительно небольшой базой данных и с СУБД, которая может выполнять ее резервное копирование / экспорт относительно быстро (например, MS SQL Server), вы можете создать резервную копию базы данных до того, как тесты, а затем восстановить его, когда все тестирование завершено. Это позволяет вам настроить базу данных разработки / тестирования и использовать ее в качестве исходного состояния для всех ваших тестов.

Я сделал это с собственным JDBC, выполнив '' резервную базу данных '' и '' базу данных восстановления '' T- Промежуточные тесты SQL, и они работали достаточно хорошо.

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

0
ответ дан 4 December 2019 в 23:07
поделиться

DBUnit очень поможет в этом. Теоретически вы можете отключить автоматическую фиксацию на JDBC, но это будет сложно. Наиболее очевидное решение - использовать DBUnit для установки известного состояния данных перед запуском тестов. ЕСЛИ по какой-то причине вам нужны ваши данные после запуска тестов, вы можете посмотреть @AfterClass в наборе, который запускает все ваши тесты, но обычно считается лучшей практикой настроить ваши тесты, а затем запустить их, поэтому что если тест не проходит, это не только потому, что у него не было готовой среды из-за неспособности очистить другой тест. Вы гарантируете, что каждый тест настраивает свою среду напрямую.

0
ответ дан 4 December 2019 в 23:07
поделиться

Есть ли причина, по которой вам необходимо подключение к базе данных для запуска модульных тестов? Похоже, что было бы проще реорганизовать ваш класс, чтобы вы могли имитировать взаимодействие с базой данных. Вы можете имитировать классы (за некоторыми исключениями), а также интерфейсы с EasyMock (www.easymock.org).

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

0
ответ дан 4 December 2019 в 23:07
поделиться

Вы можете посмотреть аннотацию @AfterClass для Junit 4. Эта аннотация будет запущена после завершения тестов.

http://cwiki.apache.org/DIRxDEV/junit4 -primer.html

0
ответ дан 4 December 2019 в 23:07
поделиться

DNUnit должен помочь вам в этом отношении. При желании вы можете создать отдельные наборы данных для каждого отдельного теста.

0
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

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