класс javafx.scene.Node имеет пару методов setUserData (Object) и Object getUserData ()
, которые вы могли бы использовать для добавления вашей информации в узел.
So , вы можете вызвать page.setUserData (info);
И контроллер может проверить, задана ли информация. Кроме того, вы можете использовать ObjectProperty для пересылки данных назад, если это необходимо.
Соблюдайте документацию здесь: http://docs.oracle.com/javafx/2/api/javafx/fxml /doc-files/introduction_to_fxml.html Перед фразой «В первой версии handleButtonAction () помечен с помощью @FXML, чтобы разрешить разметку, определенную в документе контроллера, вызвать ее. Во втором примере поле кнопки аннотируется, чтобы позволить загрузчику устанавливать его значение. Метод initialize () аналогично аннотируется. "
Итак, вам нужно связать контроллер с узлом и установить пользовательские данные для узла.
Позвольте мне начать путем включения источников - Прагматическое Поблочное тестирование в Java с JUnit (существует версия с C#-Nunit также.. но у меня есть этот.. его агностик по большей части. Рекомендуемый.)
Хорошие Тесты должны быть ПРОХОЖДЕНИЕ А (acronymn не является достаточно липким - у меня есть распечатка cheatsheet в книге, которую я должен был вытащить, чтобы удостовериться, что я разобрался в этом..)
Профессионал : В конечном счете у Вас будет столько же тестового кода сколько производство (если не больше), поэтому следуйте тому же стандарту хорошего дизайна для Вашего тестового кода. Хорошо учтенные классы методов с показывающими намерение именами, Никаким дублированием, тестами с хорошими именами, и т.д.
Хорошие тесты также работают Быстрый . любой тест, который принимает половину секунды для выполнения.. потребности, которые будут работаться на. Дольше набор тестов берет для выполнения.. менее часто это будет выполнено. Больше изменений dev попытается красться между выполнениями.. если что-нибудь повреждается.. займет больше времени выяснить, какое изменение было преступником.
Обновление 2010-08:
Кроме них, большинство других - инструкции, которые сокращают работу низкого преимущества: например, 'Не делают тестового кода, которым Вы не владеете' (например, сторонний DLLs). Не идите о тестировании методов get и методов set. Следите за отношением стоимости для преимущества или дефектной вероятностью.
Думайте о 2 типах тестирования и рассматривайте их по-другому - функциональное тестирование и тестирование производительности.
Использование различные исходные данные и метрики для каждого. Вы, возможно, должны использовать различное программное обеспечение для каждого типа теста.
Часто модульные тесты основаны на фиктивном объекте или дразнят данные. Мне нравится писать три вида модульных тестов:
точка должна постараться не воспроизводить все , чтобы быть в состоянии протестировать каждый функции.
Я второй "ПРОХОЖДЕНИЕ" ответ, за исключением того, что тесты ДОЛЖНЫ полагаться друг на друга!!!
, Почему?
DRY - не Повторяет Себя - относится к тестированию также! Тестовые зависимости могут помочь 1) сохранить время установки, 2) сохранить ресурсы приспособления и 3) точно определить к отказам. Конечно, только, учитывая, что Ваша среда тестирования поддерживает первоклассные зависимости. Иначе я признаю, они плохи.
Никогда не предполагайте, что будут работать тривиальные 2 метода строки. Запись быстрого модульного теста является единственным способом предотвратить недостающий пустой тест, неуместный знак "минус" и/или тонкую ошибку обзора от кусания Вас, неизбежно когда у Вас есть еще меньше времени для контакта с ним, чем теперь.
Поля сойки имеют партия хороших советов о записи модульных тестов и существует сообщение, где он суммирует самые важные советы . Там Вы считаете, что необходимо критически думать о контексте и судье, если совет стоит Вам. Вы получаете тонну удивительных ответов здесь, но ваше дело, решают, который является лучшим для Вашего контекста. Судите их и просто рефакторинг, если он плохо пахнет Вам.
Наилучшие пожелания
Я покрыл эти принципы некоторое время назад в статья This MSDN Magazine, которая я думаю, важно для любого разработчика для чтения.
способ, которым я определяю "хорошие" модульные тесты, то, если они отряды следующие три свойства:
Тест должен первоначально перестать работать. Тогда необходимо записать код, который заставляет их передать, иначе Вы рискуете писать тест, который прослушивается и всегда передает.
Что Вы, после формирование рисунка поведений класса под тестом.
основное намерение является увеличением Ваша уверенность в поведении класса.
Это особенно полезно при рассмотрении рефакторинга кода. У Martin Fowler есть интересное статья относительно тестирования на его веб-сайте.
HTH.
аплодисменты,
Rob
свойства Some больших модульных тестов:
, Когда тест перестал работать, должно быть сразу очевидно, где проблема заключается. Если необходимо использовать отладчик для разыскивания проблемы, то тесты не достаточно детализированы. Наличие точно одного утверждения на тест помогает здесь.
, Когда Вы осуществляете рефакторинг, никакие тесты не должны перестать работать.
Тесты должны работать настолько быстро, что Вы никогда не смущаетесь выполнять их.
Все тесты должны всегда передавать; никакие недетерминированные результаты.
Модульные тесты должны быть хорошо учтены, точно так же, как Ваш производственный код.
@Alotor: Если Вы предлагаете, чтобы библиотека только имела модульные тесты в своем внешнем API, я не соглашаюсь. Я хочу модульные тесты на каждый класс, включая классы, которые я не представляю внешним вызывающим абонентам. (Однако , если я чувствую потребность к тестам записи на закрытые методы, тогда я должен осуществить рефакторинг. )
<час>РЕДАКТИРОВАНИЕ: был комментарий о дублировании, вызванном "одним утверждением на тест". А именно, если у Вас есть некоторый код, чтобы настроить сценарий, и затем хотеть сделать несколько утверждений об этом, но только иметь одно утверждение на тест, Вы могли бы дублирование установка через несколько тестов.
я не проявляю тот подход. Вместо этого я использую тестовые приспособления на сценарий . Вот грубый пример:
[TestFixture]
public class StackTests
{
[TestFixture]
public class EmptyTests
{
Stack<int> _stack;
[TestSetup]
public void TestSetup()
{
_stack = new Stack<int>();
}
[TestMethod]
[ExpectedException (typeof(Exception))]
public void PopFails()
{
_stack.Pop();
}
[TestMethod]
public void IsEmpty()
{
Assert(_stack.IsEmpty());
}
}
[TestFixture]
public class PushedOneTests
{
Stack<int> _stack;
[TestSetup]
public void TestSetup()
{
_stack = new Stack<int>();
_stack.Push(7);
}
// Tests for one item on the stack...
}
}
Тесты должны быть изолированы. Один тест не должен зависеть от другого. Еще больше тест не должен полагаться на внешние системы. Другими словами, протестируйте Ваш код, не код, от которого зависит Ваш код. Можно протестировать те взаимодействия как часть интеграционных тестов или функциональных испытаний.
Помните об этих целях (адаптированный из книги xUnit Тестовые Шаблоны Meszaros)
Некоторые вещи сделать это легче:
не забывают, что можно сделать intergration, тестирующий с xUnit платформой также , но сохранить тесты intergration и модульные тесты отдельными
Мне нравится Правильный акроним BICEP от вышеупомянутого Прагматическое Поблочное тестирование книга:
Лично я чувствую, что можно стать довольно далекими путем проверки, что Вы добираетесь, правильные результаты (1+1 должен возвратиться 2 в дополнительной функции), испытывая все граничные условия, о которых можно думать (такие как использование, два числа которого сумма больше, чем целое число макс., оценивают в добавить функции), и вызывающий состояния ошибки, такие как отказы сети.
Хорошие тесты должны сопровождаться.
Я не совсем понял, как это сделать для сложных сред.
Все учебники начинают склеиваться, когда начинается ваша база кода достижения в сотни тысяч или миллионы строк кода.
Хорошая архитектура может контролировать некоторую часть взрыва взаимодействия, но неизбежно
Где вы храните тестовые наборы в своей кодовой базе?
Я мог бы продолжать вечно, но моя точка зрения такова:
Тесты должны быть ремонтопригодны.
Большинство ответов здесь, похоже, относятся к лучшим практикам модульного тестирования в целом (когда, где, почему и что), а не к написанию самих тестов (как). Поскольку вопрос казался довольно конкретным в части «как», я решил опубликовать его, взятый из презентации «коричневого мешка», которую я проводил в моей компании.
1 , Используйте длинные описательные названия методов тестирования.
- Map_DefaultConstructorShouldCreateEmptyGisMap()
- ShouldAlwaysDelegateXMLCorrectlyToTheCustomHandlers()
- Dog_Object_Should_Eat_Homework_Object_When_Hungry()
2. Напишите свои тесты в стиле Упорядочить / Действовать / Утвердить .
3. Всегда предоставляйте сообщение об ошибке вместе с вашими утверждениями.
Assert.That(x == 2 && y == 2, "An incorrect number of begin/end element
processing events was raised by the XElementSerializer");
4. Прокомментируйте причину теста - каковы бизнес-предположения?
/// A layer cannot be constructed with a null gisLayer, as every function
/// in the Layer class assumes that a valid gisLayer is present.
[Test]
public void ShouldNotAllowConstructionWithANullGisLayer()
{
}
5. Каждый тест должен всегда возвращать состояние любого ресурса, которого он касается.
Я использую согласованное соглашение об именах тестов, описанное Стандарты именования модульных тестов Роя Ошерова Каждый метод в данном классе тестового примера имеет следующий стиль именования MethodUnderTest_Scenario_ExpectedResult.
Каждая секция использует верхний регистр верблюда и ограничена нижней оценкой.
Я нашел это полезным, когда я запускаю тест, тесты сгруппированы по имени тестируемого метода. И наличие соглашения позволяет другим разработчикам понять цель теста.
Я также добавляю параметры к имени метода, если тестируемый метод был перегружен.