Поблочное тестирование на коде, который использует [закрытую] Базу данных

Предупреждение: невозможно изменить информацию заголовка - уже отправленные заголовки

Случается, когда ваш скрипт пытается отправить HTTP-клиенту клиенту, но он уже был выведен ранее, что привело к тому, что заголовки уже отправлены на клиент.

Это E_WARNING , и он не остановит сценарий.

Типичным примером может быть файл шаблона, подобный этому:


    
    My Page

...

Функция session_start() попытается отправить клиенту файлы cookie сеанса. Но PHP уже отправил заголовки, когда он написал элемент в выходной поток. Вам нужно будет переместить session_start() в верхнюю часть.

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

Часто пропускаемый вывод - это новые строки после закрытия PHP ?>. Считается стандартной практикой опускать ?>, когда это последняя вещь в файле. Аналогичным образом, еще одной распространенной причиной этого предупреждения является то, что перед открытием перед ним появляется пустое пространство, строка или невидимый символ, в результате чего веб-сервер отправляет заголовки и пробел / новую строку, таким образом, когда PHP начинает синтаксический анализ, он не сможет для отправки любого заголовка.

Если в вашем файле содержится более одного кодового блока , у вас не должно быть пробелов между ними. (Примечание: у вас может быть несколько блоков, если у вас есть код, который был автоматически сконструирован)

Также убедитесь, что в вашем коде не указаны знаки байтового заказа, например, когда кодировка скрипта является UTF -8 с BOM.

Вопросы, относящиеся

42
задан Community 23 May 2017 в 12:33
поделиться

11 ответов

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

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

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

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

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

32
ответ дан Anthony 26 November 2019 в 23:55
поделиться

Мы делаем несколько приемов:

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

  1. Наше приложение может генерировать таблицы и действительно обновляет, ступает само (никакие отдельные сценарии дб). Это помогает нашему клиенту, потому что он только должен заглядывать ВОЕННОМУ файлу, и он сделан. Приложение смотрит на базу данных и выполняет любые операторы DDL, необходимые перед запуском остальной части контекста Spring.
  2. Наш набор тестов имеет некоторый код, который разгружает контекст Spring, отбрасывает базу данных и перезапускает контекст с чистой базой данных. Мы можем дополнительно выключить это, если нам нравится
  3. , Вся наша база данных/SQL unittests является Spring транзакционные интеграционные тесты. Это означает, что после того, как тест сделан, транзакции откатываются, и другой unittests снова посмотрит на чистую базу данных.

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

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

3
ответ дан Rolf 26 November 2019 в 23:55
поделиться

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

12
ответ дан Mauricio Scheffer 26 November 2019 в 23:55
поделиться

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

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

3
ответ дан Aaron Palmer 26 November 2019 в 23:55
поделиться

Зависит от случая, но в унаследованных системах, где я wan't, чтобы погасить базу данных я часто представляю интерфейс, позволяет, заявляют IFooDBManager, который имеет методы, которые возвращают объекты ADO.NET, как таблицы данных или наборы данных. Конечно, это не должен быть интерфейс, но это мог быть виртуальный метод, например. Затем в моих тестах я использую маленький API с быстрым интерфейсом, который я создал сам давным-давно, я использую это для создания наборов данных и таблиц и заполнения их с тестовыми значениями так, чтобы я мог возвратить их из своих фальшивок.

быстрый интерфейс выглядит примерно так:

return DataTableBuilder.Create()
    .DefineColumns("a, b")
    .AddRow().SetValue("a", 1).SetValue("b", 2).DoneWithRow()
    .AddRow().SetValue("a", 10).SetValue("b", 20).DoneWithRow()
.Table

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

РЕДАКТИРОВАНИЕ: Я забыл разъяснять, что это для того, чтобы погасить базу данных, таким образом, взаимодействие с базой данных не тестируется в этом случае. Фактическое взаимодействие произойдет в конкретной реализации IFooDBManager, для тестирования , что что-то еще полностью необходимо.

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

2
ответ дан Patrik Hägne 26 November 2019 в 23:55
поделиться

Я обычно использую два подхода.

код, который зависит от работ уровня абстракции базы данных с МОК и является поэтому легко тестируемым с насмешками/тупиками. Вы имеете IDataAccess или интерфейс IRepository, и Вы тестируете взаимодействия своего кода против него.

код, который на самом деле работает против базы данных (говорят класс, реализовывая IDataAccess) тестируется самостоятельно, обычно выполняя распространения в прямом и обратном направлениях к базе данных (insert-retrieve-update-retrieve-delete). Прежде, чем выполнить каждый тестовый сценарий база данных воссоздана или освобождена для предотвращения тестовых перекрестных помех. Это приводит к тестам, требующим, чтобы несколько минут работали вместо нескольких секунд, но по-моему важно протестировать фактическую базу данных, которую Вы будете использовать в производстве. Используя замену, такую как SQLite в оперативной памяти не хороший выбор, потому что это слишком отличается от, например, SQL Server.

1
ответ дан Dario Solera 26 November 2019 в 23:55
поделиться

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

Одна из платформ, что мы продолжаем работать, является Насмешками Носорога. Можно читать об этом в ссылке ниже. Это также имеет хорошее введение того, почему Вам нужны такие платформы.

http://weblogs.asp.net/stephenwalther/archive/2008/03/22/tdd-introduction-to-rhino-mocks.aspx

1
ответ дан Ather 26 November 2019 в 23:55
поделиться

вот , хороший экран набрал эту тему названный Значение Маленьких Тестов

1
ответ дан Charles Faiga 26 November 2019 в 23:55
поделиться

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

0
ответ дан Oleg 26 November 2019 в 23:55
поделиться

Spring имеет тестовые классы, которые являются транзакционными. Отберите данные тестирования, запустите тесты, откатывайте их. Это - как будто Вы никогда не были там.

0
ответ дан duffymo 26 November 2019 в 23:55
поделиться

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

0
ответ дан 26 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

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