11 июня 2014 г.

Учим Genie самостоятельно определять путь к class файлам.


В одной из предыдущих статей мы делали запуск скриптов Genie.
Выглядело это так:
GenieScriptsExecutor.ExecuteScript("Path to GenieScript.class");

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

public class GenieScriptsExecutor { 
       public static void ExecuteScript(Class<?> classname)  {
          try {
             String[] path_arr = {getClassLocation(classname)};
             Executor.startExecution(path_arr);
          } 
          catch (ClassNotFoundException e) {
             e.printStackTrace();
          }
 
       }

   private static String getClassLocation(Class<?> c){
     String filename = c.getSimpleName();
     String path = c.getResource(filename+".class").getPath();
   return path;
  }
}

Теперь запуск скриптов будет выглядеть так:
GenieScriptsExecutor.ExecuteScript(SomeGenieScript.class);

3 комментария:

  1. Здравствуйте, Дмитрий.

    Настал день очередного глупого вопроса :)


    в приведенном выше коде вылетает ошибка на строку
    String[] path_arr = getClassLocation(classname);

    "Type mismatch: cannot convert from String to String[]"

    можно ли это как-то обойти?


    И, наверное, главный вопрос.. можно ли как-то в тестах добавить проверку на подключение genie server и нужного genie script?
    Ибо, даже если скрипт джина по каким-либо причинам не может быть выполнен, тест считается успешно пройденным.
    Не сталкивались ли вы с подобной проблемой?

    ОтветитьУдалить
  2. дабы решить проблему с выводом ошибки при неправильном подключении джин скрипта, внесла небольшие изменения в ваш парсер:


    public static ShortTestResult getShortExecutionResult(String xml){
    ShortTestResult str = new ShortTestResult();
    TestResultsModel parsedresult = DeserializeXML(xml);
    ArrayList testcases = parsedresult.testCases;
    String errorMessages = "";
    if (testcases != null) {
    for (TestCase testCase : testcases) {
    ArrayList testSteps = testCase.testScript.testSteps;
    for (TestStep testStep : testSteps) {
    String teststatus = testStep.testresults.status;
    if(teststatus.equals("Failed")){
    str.setExecutionStatus(teststatus);//если хоть один шаг упал, то мы будем считать весь тест упавшим
    }
    if (testStep.message!=null){ //Собираем все сообщения об ошибках
    errorMessages += testStep.message.messagetext +"\n";
    }
    }
    }
    } else if (parsedresult.messages != null && parsedresult.messages.message != null) {
    Message message = parsedresult.messages.message;
    errorMessages += message.messagetext;
    str.setExecutionStatus("Failed");
    }
    str.setMessage(errorMessages);
    return str;
    }



    с объявлением нового класса в testresultmodel:

    public static class Message{
    @XmlAttribute(name = "message")
    String messagetext;

    @XmlAttribute(name = "type")
    String type;
    }


    может быть кому-то пригодится :)

    ОтветитьУдалить
  3. Доброго времени суток :) Ну конечно, я ошибся. Метод getClassLocation() возвращает результат String. В Executor же нужно передать массив строк.
    Можно просто сделать так:
    String[] path_arr = {getClassLocation(classname)};

    Со второй задачей, вижу, вы справились.

    ОтветитьУдалить