Программа тестирования java

#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, Дамо