2015-05-05 3 views
1

Кто-нибудь знает, можно ли использовать селен WebDriver (im, используя java) для проверки сообщений в файлах журналов?Selenium для проверки файлов журнала

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

Моего текущий метод для достижения этой цели кажется слишком сложным:

  • Выполнить действия в переднем конце
  • Запуск сценария оболочки проверить лог-файлы с Selenium Test (включает в себя SSH к серверу, как журналы хранятся там)
  • Создать «Выполнена» сообщение в простом текстовом файле на сервере, если журналы показывают действие завершается иначе показать «Действие не завершено» файл
  • Scp обратно к моей машине/VM
  • читать файл затмить
  • Создать метод тестирования для проверки содержимого файла что-то вроде если («Выполнено» сообщение возвращается -> продолжить) еще (повтор от точки пули 2)

Есть более простой путь???

+1

Селен не очень хорошо подходит для этого. Используете ли вы тестовую среду (JUnit/TestNG) для выполнения тестов? Если это так, вы можете использовать любой Java-способ для реализации этого. – Magnilex

+0

Да, я использую JUnit для выполнения тестов. Однако с java я все еще сталкиваюсь с теми же проблемами, что и проверять журналы, которые мне нужны для ssh, на серверы, запускать проверки журналов и отправлять результаты на мою машину. Есть ли способ лучше? –

+0

Завершение действия можно найти, указав изменение элемента при переходе на новую страницу, или мы можем сохранить глобальную переменную, которая может быть установлена ​​как истина/ложь при выполнении транзакций (например, в пользовательском интерфейсе Echo - EchoServerTransaction.active = "true /ложный"). – Nagappan

ответ

0

Добавить на ваш сайт специальную страницу, обрабатывающую файл журнала. Имейте общую тайну, которую знает селен, и сайт, если вам нужно сохранить файл журнала конфиденциальным. Затем просто зайдите на эту страницу и используйте обычные методы для проверки строк.

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

0

С настоящим решением, которое вы описываете, Selenium на самом деле не является подходящим инструментом для работы (хотя вы, вероятно, можете найти решение).

Я вижу несколько возможных подходов:

  1. Добавить страницу, которая показывает прогресс (как это было предложено Превосходство). Это может быть отдельная страница или какое-то сообщение в существующем графическом интерфейсе. Это может быть только для Selenium, или, может быть, это может стать подходящей функцией для всех пользователей (или только для администраторов), если это имеет смысл для вашей системы.
  2. Используйте такую ​​систему, как описано, но запустите сервер в локальной системе (в качестве специального тестового экземпляра). Затем вы можете пропустить SSHing.
  3. Создайте службу (REST или аналогичную) на сервере для запроса статуса задания. Опять же, это может быть полезно не только для тестирования.

Что имеет смысл, зависит от того, как используется система (как пользователи в настоящее время проверяют, выполнено ли задание, какая информация о задании интересна и т. Д.).

+0

Спасибо всем за ваши быстрые и подробные ответы. Я взял немного, что все сказали, поскольку я думаю, что нашел более простое решение. Если вам интересно, я теперь запускаю все команды оболочки в отдельном методе и возвращаю вывод файлов журнала обратно на консоль Eclipse. Оттуда его довольно просто запускать команды регулярных выражений на выходе и выполнять дальнейшие действия в одном месте. Кажется, что он работает неплохо. Следующий шаг - добавление многопоточного кода, поэтому я могу проверять журналы в фоновом режиме во время выполнения другой проверки, *** gulp *** –

+0

@ DanielCohen: Я рад, что вы нашли решение своей проблемы. Подумайте о том, как добавить свое решение в качестве ответа - здесь предлагаются индивидуальные ответы, чтобы помочь другим с той же проблемой. – sleske

-1

Чтобы проверить, что действие завершено, проверка журналов сервера может быть решением. Но все же в графическом интерфейсе мы могли видеть видимость некоторых элементов или сообщений html или java-скриптов или переопределения функций javscript.

С помощью Selenium JavscriptExecutor мы можем переопределить alert method (см. Пример 21), аналогично мы можем переопределить onreadystatechange для завершения запроса/ответа.

Переменные окна JavaScript могут использоваться для отображения полноты действий путем проверки after each ajax request.

Мы можем использовать selenium wait, чтобы ждать, пока элемент станет видимым, идентифицируйте элемент using xpath.

В приведенной ниже ссылке для поиска элементов, ввода текста в текстовом поле и т. Д. Имеется больше учебников. http://software-testing-tutorials-automation.blogspot.com/2014/05/selenium-webdriver-tutorials-part-two.html

0

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

Actual Ответ:

я сделал следующую деятельность для моего проекта

  1. очистить журналы, используя скрипт на удаленном сервере UNIX
  2. Выполните передний конец деятельности
  3. журналы захвата после того, как предопределенное время (скажем, 60 секунд)
  4. SFtp обратно на клиентскую машину

Сначала вам понадобится клиент SFTP и клиент SSH для взаимодействия с сервером unix. здесь Узел - это объект, содержащий данные Unix env. поэтому измените соответственно. Использование JSch Библиотека для этого

public static String runCommand(String Command, Node node) 
{ 
    String output = null; 
    if (node.getConnType().equals("SSH")){ 
     int exitStatus = 0; 
     try{ 
       JSch jsch=new JSch(); 

       JSch.setConfig("StrictHostKeyChecking", "no"); 

       Session session=jsch.getSession(node.getUserName(), node.getHost(), 22); 

       session.setPassword(node.getPassword()); 
       session.setConfig("PreferredAuthentications", 
         "publickey,keyboard-interactive,password"); 

       session.connect(); 

       String command=Command; 

       Channel channel=session.openChannel("exec"); 
       ((ChannelExec)channel).setCommand(command); 

       channel.setInputStream(null); 
       ((ChannelExec)channel).setErrStream(System.err); 
       InputStream in=channel.getInputStream(); 
       channel.connect(); 

       byte[] tmp=new byte[1024]; 
       while(true){ 
       while(in.available()>0){ 
        int i=in.read(tmp, 0, 1024); 
        if(i<0)break; 
        output = new String(tmp, 0, i); 
       } 
       if(channel.isClosed()){ 
        if(in.available()>0) continue; 
        exitStatus= channel.getExitStatus(); 
        //System.out.println("exit-status: "+exitStatus); 
        break; 
       } 
       try{Thread.sleep(1000);}catch(Exception ee){} 
       } 
       channel.disconnect(); 
       session.disconnect(); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
      if (exitStatus == 0) 
      { 
       if(output != null) 
        return output.replaceAll("[\\n\\r]", ""); 
      } 
    } 
    return null; 
    } 

SFTP клиент

public boolean transferFileSFTP(Node node,String srcDir,String targetDir,String srcFileName,String targetFileName, String direction) 
{ 
    JSch jsch = new JSch(); 
    Session session = null; 
    try { 
     session = jsch.getSession(node.getUserName(), node.getHost(), 22); 
     session.setConfig("StrictHostKeyChecking", "no"); 
     session.setConfig("PreferredAuthentications", 
       "publickey,keyboard-interactive,password"); 
     session.setPassword(node.getPassword()); 
     session.connect(); 

     Channel channel = session.openChannel("sftp"); 
     channel.connect(); 
     ChannelSftp sftpChannel = (ChannelSftp) channel; 
     System.out.println("src:" + srcDir+srcFileName); 
     System.out.println("target:" + targetDir+targetFileName); 
     sftpChannel.get(targetDir+targetFileName, srcDir+srcFileName); 
     sftpChannel.exit(); 
     session.disconnect(); 
     return true; 
    } catch (JSchException e) { 
     e.printStackTrace(); 
    } catch (SftpException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 

Теперь дождаться нужного времени и сделать его резьба на основе собирать журналы одновременно из различных приложений участвуют, с использованием Исполнитель-сервис и Будущее < Строка > Утилиты

Созданный таким образом один класс LogCollector, который инициирует запрос, а другой - ThreadClass (логический), который будет выполнять действия в файле журнала.

LogCollector.java

public class LogCollector { 

    private static ExecutorService pool = Executors.newFixedThreadPool(100); 
    private static List<Future<String>> list = new ArrayList<Future<String>>();  

    public static void add(Node node, String srcDir, String targetDir, String srcFileName, String targetFileName, long wait) 
    { 
     list.add(pool.submit(new LogCollectorThread(System.currentTimeMillis()/1000,wait, srcDir, targetDir, srcFileName, targetFileName, node)));      
    } 

    public static void getResult() 
    { 
     try{ 
      for (Future<String> future : list) { 
       String out =future.get(); 
       //DO whatever you want to do with a response string return from your thread class 
      } 
      pool.shutdown(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     }  
    } 

} 

LogCollectorThread.java

public class LogCollectorThread implements Callable<String>{ 
    long startTime; 
    long wait; 
    String srcFileName; 
    String targetFileName; 
    String srcDir; 
    String targetDir; 
    Node node; 

    public LogCollectorThread(long startTime, long wait,String srcDir, String targetDir,String srcFileName, String targetFileName, 
      Node node) { 
     super(); 
     this.startTime = startTime; 
     this.wait = wait; 
     this.srcFileName = srcFileName; 
     this.targetFileName = targetFileName; 
     this.srcDir = srcDir; 
     this.targetDir = targetDir; 
     this.node = node; 
    } 
    /*** 
    * Returns a String with Parameters separated by ',' and status at the end 
    * status values: 
    * 0 - successfully retrieved log file 
    * 1 - failure while retrieving log file 
    */ 
    @Override 
    public String call() throws Exception { 
     while((System.currentTimeMillis()/1000 - startTime)<=wait) 
     { 
      Thread.sleep(1000); 
     } 
     MyFTPClient sftp= new MyFTPClient(); 
     boolean result =sftp.transferFileSFTP(this.node, this.srcDir, this.targetDir, this.srcFileName, this.targetFileName, "From"); 
     System.out.println(this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName); 
     if(result == true) 
      return this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName +"," + "0" ; 
     else 
      return this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName +"," + "1" ; 
    } 
} 

Как использовать LogCollector классы:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()); 
    Helper.runCommand("cd /opt/redknee/app/crm/current/log/; echo > AppCrm.log", testEnv.getBSS()); 

    LogCollector.add(testEnv.getBSS(), "collectedLogs\\", "/opt/redknee/app/crm/current/log/", timeStamp + "_" + testEnv.getBSS().getHost() + "_BSS_AppCrm.log" , "AppCrm.log", 60); 

    //So your thread is working now, so now perform your Front End Activity 
    //After 60 seconds, log file will be SFTPed to client host 
    //You can perform you activity before adding logCollectorThread or just before that 

    LogCollector.getResult(); 

Здесь я дал слишком много кода, Но слишком сложно описать каждый шаг по строчке. Главное, что я хотел доказать, это использование java. Большинство вещей возможны. Вам решать, насколько это важно, и стоит ли этого делать.

Теперь подходит к вашему точному требованию поиска определенной строки.

Как вы можете видеть в logCollectorThread, , в настоящее время я ничего не делаю, а жду только 60 секунд. Так здесь вы можете использовать RunCommand для Grep нужной строки из журналов вы можете использовать команду как

grep -i "Action Completed" | grep -v 'grep' | wc -l 

, если он возвращает 1, вы нашли свою строку Аналогично вы можете проверить на сообщения о неудаче. и вернуть желаемую строку из вашего потока и получить ее как результат в методе threadCollector.getResult().

И как только файл передается FTP вашему клиенту, разбор его для конкретной строки с использованием Java будет очень простым. StackOverflow поможет вам в этом :)

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

0

Self Answer - После рассмотрения всех сообщений это решение, которое я придумал, работает очень хорошо. У меня есть метод, который позволяет мне анализировать журналы, используя регулярное выражение прямо из Eclipse. Ниже приведен код с тяжелым комментирование, чтобы показать, что я сделал ....

public void checkLogs() throws IOException{ 
    //create an empty string to hold the output 
    String s = null; 

    // using the process API and runtime exec method to directly ssh in the client machine and run any command you like. I need the live logs so I used tail -f 
    Process p = Runtime.getRuntime().exec("ssh [email protected] tail -f /location/file"); 
    // use buffered reader to bring the output of the command run on the clinet machine back to the output in eclipse. I also created an output for the error stream to help with debugging if the commands dont work as I am not directly looking at the output when I run the commands on the client machine 
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

    // For my test I only want to continue with the clicks in the front end once I know the system has been reset. For our system this can only be checked in the logs. So I created a boolean flag which will only become true once the regex I run matches lines from the output. Use a while loop with != null to check every line of the output 
    boolean requestArrived = false; 
    while ((s = stdInput.readLine()) != null) { 
     System.out.println(s); // so I can see live what is happening. (great for debugging) 
     //search for the specific string that lets me know the system has been started the reset. (can run any regex here) 
     if(r.equalsIgnoreCase("system reset request received")){ 
      System.out.println("***********************************************************************************************"); 
      // Change the state of the boolean flag to true as we know now that the backend is ready to continue 
      requestArrived = true; 
     } 

     if(t.equalsIgnoreCase("System reset has happened successfully"))// a secondary check to see when the system is ready to continue{ 
      System.out.println("##############################################################################################"); 
      //if both string that we are looking for have been received we can continue with the rest of the script 
      if (requestArrived) { 
       break; 
      } 
     } 
    } 
    //close the terminal 
    p.destroy(); 

} 

Я надеюсь, что кто-то помогает :)

+0

вы даже не используете селен в своем ответе на свой вопрос об использовании селена. –