#java #testing
#java #тестирование
Вопрос:
Я написал программу, и теперь мне нужно написать «запускаемый тестовый скрипт» для ее тестирования.
Я полагаю, что выполняемый тестовый скрипт означает основной метод.
Но все методы, вызываемые программой, запускаются при нажатии мышью на кнопку или вводе из OptionPane
. Итак, как я могу написать исполняемый тестовый скрипт для управления щелчком мыши?
Я не знаю, четко ли я описал проблему. Программа представляет собой инструмент управления задачами проекта, поэтому вы можете нажать кнопку, чтобы создать новый проект, сохранить проект, добавить задачи, добавить сотрудников и так далее. Проблема в том, как мне контролировать, какую кнопку нажимать с помощью Java-кода?
Вот метод, который вызывается при нажатии кнопки:
public void newProject() {
if (currentProject == null || showConfirm(
"The current progress will not be saved.nContinue?")) {
resetCurrentProject();
//Get the name of the new project
String name = JOptionPane.showInputDialog(this,
"Please give a name to the project", "New Project",
JOptionPane.QUESTION_MESSAGE);
if (name != null) {
//Initialize the a new project
ArrayList<Task> taskList = new ArrayList<Task>();
ArrayList<Staff> staffList = new ArrayList<Staff>();
//Create a new Project instance
try {
currentProject = new Project(name, staffList, taskList);
} catch (Exception e1) {
showError(e1.getMessage());
}
//Update the project information panel
updateProjectInfoPane();
}
}
}
Комментарии:
1. Вы не управляете мышью, вы получаете ссылку на кнопку и запускаете какое-то событие «щелчка» по коду.
2. Как запустить событие щелчка?
3. как насчет ввода JOptionPane?
4. Прежде всего, используете ли вы Swing для создания графического интерфейса?
5. Я решил проблему с помощью тестирования графического интерфейса Abbot Java
Ответ №1:
Простое объяснение: вместо фактического управления мышью вы получаете ссылку на кнопку, нажатие на которую вы хотите имитировать. После того, как у вас есть ссылка на JButton (при условии Swing), вы можете вызвать doClick()
его (http://download.oracle.com/javase/6/docs/api/javax/swing/AbstractButton.html#doClick() ).
Для JOptionPane я понятия не имею, так как я никогда не использовал его и не знаю, что он делает, но документацию можно найти здесь независимо от того: http://download.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html
Ответ №2:
Если бы я писал это, я бы отделил интерфейс от логики. Таким образом, мои кнопки просто вызывают базовые классы, мои дисплеи вызывают базовые классы, и я могу заставить свой тестовый скрипт просто вызывать базовые классы!
Рассмотрите следующее, как если бы это был не swing, а какой-то другой тип интерфейса. Пример, который я привел, довольно неубедительный, потому что все, что он делает, это увеличивает. Но идея в том, что любая логика, которая есть у инкрементера, теперь инкапсулируется в классе. Это означает, что ее можно легко протестировать, расширить и изменить при необходимости.
// bad
class GUI {
Button b = new ...
int i = 0;
TextArea t = new ...
// bad code
actionPerformed(Button b) {
if(b == this.b) i ; // on button press increment
}
// whatever, you get the idea
paint(Graphics g) {
t.setText(i "");
}
}
// good code
class GUI {
Button b = new ...
int i = 0;
TextArea t = new ...
// bad code
actionPerformed(Button b) {
if(b == this.b) i.increment(); // on button press increment
}
// whatever, you get the idea
paint(Graphics g) {
t.setText(i.toString());
}
}
class Incrementer {
int value;
void increment() { value ; }
public String toString() { return Integer.valueOf(value); }
}
Комментарии:
1. Я знаю, и это хорошо в принципе и все, но это «если бы вы это писали», а не «если бы вы это уже написали».
2. @Alxandr Я делаю это каждый день в 9-5. Я делал это для своих заданий, когда учился в университете. Это также единственный способ сделать это (за исключением Selenium или java.awt.Robot) для такого проекта.
3. @glowcoder: я отделил интерфейс от логики, но вызывающие методы включают в себя множество других частных вспомогательных методов, которые выполняют всю проверку
4. @XiaofanWu Это довольно стандартная практика — не тестировать частные методы. Нет смысла тестировать то, что пользователи никогда не видят. Я знаю, что это не интуитивно понятно на первый взгляд, но это довольно распространенный способ работы. Я не говорю, что все пропускают частные методы, но это очень распространенное явление. По сути, вам нужно будет нарушить инкапсуляцию, чтобы добавить их в модульный тест. Это приведет объект в состояние, в котором пользователь не будет его использовать, что сделает тест менее полезным.
5. @Alxandr Между ними огромная разница. Предположим, что логика увеличения использовалась во всем нашем приложении. Примерно в 40 местах. И не только это приложение, но и дюжина других приложений. И вдруг гении маркетинга объявляют: «Наши приращения в два раза больше, чем у наших конкурентов!» и просто ожидают, что разработка будет следовать этому. Ну и дерьмо… Теперь вам нужно изменить логику увеличения в 40 местах! Во втором примере вы меняете ее один раз, она тестируется
IncrementTest
, и вы с радостью отправляете ее в производство.
Ответ №3:
Нажатие кнопок (т. Е. Графический интерфейс) — это не то, что вам следует тестировать (экстенсивно). Оставьте это тестировщикам — они либо проверяют это вручную, либо автоматизируют (Selenium, QTP).
Я предполагаю, что вам нужно написать несколько модульных тестов …? В этом случае просто напишите тест для каждого из ваших методов и выполненной работы. Предполагается, что вы не должны тестировать интерфейс, а только логику. Например, протестируйте свой метод NewProject(), написав модульный тест, который проверяет, правильно ли был инициализирован новый проект. Итак, из вашего метода тестирования вы вызываете NewProject() и утверждаете, был ли создан новый экземпляр проекта или нет.
Какой-нибудь приличный учебник: http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html
Тестирование графического интерфейса — выполняйте простые проверки самостоятельно (щелчок вручную) и передавайте их тестировщикам. Если вы не работаете ни с какими тестировщиками, то, боюсь, вам следует поступить следующим образом: 1. продолжайте тестирование вручную после любых существенных изменений, 2. Рассмотрите возможность использования Selenium http://seleniumhq.org / или любой другой инструмент автоматизации.
HTH, Дамо