Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как запустить библиотеку на Python из jybot?


(aep) #1

Добрый день, уважаемые коллеги.

Прошу помочь мне с такой проблемой:

Я запускаю свои тесты с помощью jybot, т.к. использую библиотеку на Java. Но мне необходимо так же задействовать библиотеку на Python, которая вызывает cx_Oracle. При этом я получаю ошибку

Importing test library 'c:\Testing\rf-java3\lib\OracleDB.py' failed: NameError: name 'cx_Oracle' is not defined.

(Mykhailo Poliarush) #2

Тут есть несколько способов

  1. Использовать библиотеку на java, которая используется jdbc и тогда вам не надо заморачиваться с вызовом python кода. https://github.com/ThomasJaspers/robotframework-dblibrary
  2. Использовать remote library. http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html#remote-library-interface т.е. устанавливаем и настраиваем все что нужно на python, а потом просто запускаем специальный сервер, который транслирует эту библиотеку. Дальше нужно просто подключиться к этой библиотеке через хост и порт.

Например вот так вот нужно написать библиотеку:

#!/usr/bin/env python

import os
import sys


class ExampleRemoteLibrary:
    """Example library to be used with Robot Framework's remote server.

    This documentation is visible in docs generated by _libdoc.py_
    starting from Robot Framework 2.6.2.
    """

    def __init__(self):
        """Also this doc should be in shown in library doc."""

    def count_items_in_directory(self, path):
        """Returns the number of items in the directory specified by `path`."""
        return len([i for i in os.listdir(path) if not i.startswith('.')])

    def strings_should_be_equal(self, str1, str2):
        print "Comparing '%s' to '%s'" % (str1, str2)
        if str1 != str2:
            raise AssertionError("Given strings are not equal")


if __name__ == '__main__':
    from robotremoteserver import RobotRemoteServer
    RobotRemoteServer(ExampleRemoteLibrary(), *sys.argv[1:])

так ее запустить

python examplelibrary.py localhost 8270

и так вот использовать

*** Settings ***
Library    Remote    http://localhost:${PORT}

*** Variables ***
${PORT}    8270

*** Test Cases ***

Count Items in Directory
    ${items1} =    Count Items In Directory    ${CURDIR}
    ${items2} =    Count Items In Directory    ${TEMPDIR}
    Log    ${items1} items in '${CURDIR}' and ${items2} items in '${TEMPDIR}'

Failing Example
    Strings Should Be Equal    Hello    Hello
    Strings Should Be Equal    not      equal

(aep) #3

Спасибо за ответ! Я пробовала использовать этот тестовый пример, правда немного его изменив, чтобы у меня заработало. Библиотека ExampleRemoteLibrary при инициализации не принимает аргументов, а в примере мы передаем хост, порт. И в тесте вызываем почему-то Remote. Но может быть я ошибаюсь.
Суть однако в том, что в моем случае все равно получается ошибка импорта библиотеки cx_Oracle.
В используемой библиотеке (OracleDB) я пытаюсь импортировать cx_Oracle:

try:
    import cx_Oracle
except ImportError,info:
    logger.warn ("Import cx_Oracle Error:",info)

Также добавляю вызов robotremoteserver:

if __name__ == '__main__':
    from robotremoteserver import RobotRemoteServer
    RobotRemoteServer(OracleDB(), *sys.argv[1:])    

robotremoteserver положила в папку с библиотеками lib.

Мой тестовый пример с двумя используемыми библиотеками выглядит так:

*** Settings ***
Library           MyXMLCompare
Library           OracleDB.py

*** Variables ***
${PORT}    8270

*** Test Cases ***
Usa Java Library
    ${Path1}    Set Variable    1.xml
    ${Path2}    Set Variable    2.xml
    ${encoding_string}    Set Variable    UTF-8
    ${res}    testCompare    ${Path1}    ${Path2}    ${encoding_string}
    Log    ${res}
    Should Be Equal As Integers    1    ${res}    XML are not equal. See log.
	
Remote Test
    connect_to_oracle    rddb3    EP_SCC_63    EP_SCC_63

Запускаю через jybot:

set CLASSPATH=%CD%\lib\com.springsource.org.custommonkey.xmlunit-1.2.0.jar;%CLASSPATH%
jybot --variable PORT:7777 --pythonpath lib java-custom-library.txt

Ошибка: Importing test library ‘c:\Testing\RF_training\rf-java3\lib\OracleDB.py’ failed: NameError: name ‘cx_Oracle’ is not defined

В чем я неправа?


(Mykhailo Poliarush) #4

@aep надо внимательно прочитать и перечитать, что такое Remote Library

http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html#remote-library-interface

https://code.google.com/p/robotframework/wiki/RemoteLibrary

Фактически, Вы сделали библиотеку для запуска через Remote Library а вызываете ее напрямую через код теста, а не через сервер.

Вот как было показано в выше указанном примере:

*** Settings ***
Library    Remote    http://localhost:${PORT}

*** Variables ***
${PORT}    8270

http://localhost:${PORT} это и есть ваш запущенный сервер через, который будет проходить вызов кейвордов


(aep) #5

Поняла. Исправила:

Library           OracleDB.py	http://localhost:${PORT}

Вызываю:

jybot --pythonpath lib java-custom-library.txt

Все та же ошибка :frowning: Должен работать импорт? У меня сомнение, ведь сама cx_Oracle лежит в Python27. Может быть ее нужно в пути прописать?


(Mykhailo Poliarush) #6

Вам надо вызывать Remote библиотеку, а не .py файл

Еще раз повторяю, надо внимательно прочитать, как работает Remote Library. Возьмите пример из https://code.google.com/p/robotframework/wiki/RemoteLibrary и попытайтесь его запустить без своих изменений, ровно как там есть. Как только поймете, как работает Remote Library так сразу и поменяете на свой код.


(aep) #7

Получилось. Спасибо большое!


(Mykhailo Poliarush) #8

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

Спасибо.


(aep) #9

Мой пример не сильно сложнее, просто я не врубилась, как работает remote library. Нужно внимательнее читать документацию…