Расширяем RobotFramework для проверки eмейлов

python
email
jython
robot-framework
Теги: #<Tag:0x00007fedbc0543b0> #<Tag:0x00007fedbc0541a8> #<Tag:0x00007fedbc05bef8> #<Tag:0x00007fedbc05bbb0>

(Mykhailo Poliarush) #1

В первых двух уроках  (How to use RobotFramework With
SeleniumLibrary
и How to use RobotFramework Part 2), Метью Балтел показал нам как использовать Robot Framework для тестирования ваших веб приложений. К сожалению, Robot Framework не всегда дает вам средства для тестирования того, что вы хотели бы протестировать. В качестве компенсации этого, Robot Framework дает нам возможность создать собственные тестовые библиотеки.

В этом уроке нашей целью будет научиться создавать такие библиотеки и  использовать их в ваших тестах. В уроке есть только вариант с использованием  Python для создания библиотек, но, в любом случае, их можно внедрять, используя  Java если вы работаете с  Jython. В этом уроке я буду опираться на то, что вы хоть немного знакомы с Python.  Если это не так,  Robot Frameworks дает отличный урок, который поможет вам начать свое знакомство с  Python. Советую держать его неподалеку, чтобы вы могли понимать все что происходит в ходе этого руководства.

И в завершение, хочу сказать, что если вы хотите получить еще несколько подсказок на эту тему, изучите  Robot Framework, руководство пользователя.

Давайте начнем

В первую очередь, вам необходимо создать класс или модуль  python. Создавая свой файл, вы должны помнить, что его название будет также названием вашей библиотеки. Если вы хотите создать класс, я рекомендую  дать вашему классу такое же название как и файлу, чтобы вы могли пропустить название модуля при импорте вашей библиотеки.Если вы все же хотите дать им разные названия, вам необходимо импортировать  moduleName.MyLibName.

Теперь, когда у вас есть файл, вам следует задать две переменные, чтобы дать информацию  Robot Framework. Первая называется  ROBOT_LIBRARY_SCOPE. Она используется для того, чтобы «сказать»  Robot Framework следует ли ему создавать новые примеры в вашей библиотеке один раз для каждого тестового случая, один раз для одного набора тестов или один раз за все выполнение теста.  Значения этих переменных следующие:  TEST CASE (по умолчанию), TEST SUITE и GLOBAL.

Вторая:  ROBOT_LIBRARY_VERSION (или __version__), определяющая версию вашей библиотеки.
(например : 0.1, 1.1.3, 1 … Тут все зависит от того, как вы хотите считать).

Ваш файл должен
выглядеть следующим образом:

import someusefullib
import anotherusefullib
 
class mylib:
 
    ROBOT_LIBRARY_SCOPE = 'TEST_SUITE'
    __version__ = '0.1'

Вы уже создали свою первую библиотеку  (Да !), а теперь давайте поможем ей выполнять определенный действия.

Для нашей библиотеки check_mail.py

У нас есть:

import imaplib
 
class check_mail:
 
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
    __version__ = '0.1'

Ключевые слова для Robot Framework

Для создания ключевых слов, которые можно использовать в ваших наборах тестов, необходимо просто создать новый метод в вашем классе (или модуле). Название этой функции и будет ключевым словом, потребуется только маленькие согласования. Первое, совпадение между названиями метода и ключевыми словами не чувствительно у регистру, а это значит, что   “Pwet” и “pwet” будут обращаться к одному и тому же методу в вашей библиотеке  (например, pwet). Также, совпадение игнорирует подчеркивание и пробелы, а это значит, что ключевое слово 
“Try This” совпадает с  “TryThis” и “Try_this”.

Аргументы

Если вашей библиотеке необходимы агрументы  (для конструктора) вам потребуется всего лишь добавить метод  __init__  со всеми необходимыми вам аргументами. В этом случае вам потребуется добавить
их в вашу библиотеку при их импорте.

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

def many_args(*args):
    print args

Вы также можете задать
значения по умолчанию для ваших аргументов (не обязательно для всех)

def default_arg (arg1, arg2='default'):
    print arg1, arg2

Ошибки

Обработка ошибок довольно проста. Статус ключевого слова сообщается благодаря исключениям, что значит, что если  ключевое слово попадает на исключение, его возвращаемым значением будет  FAIL, а если же оно возвращается нормально, его значением будет PASS.

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

def check_mail(self, *args):
    r, self.item = self.mailbox.search(None, *args)
    self.item = self.item[0].split()
    if self.item == []:
        raise AssertionError("No mail found")

Этот пример будет вызывать поиск по методу  imaplib. В случае, если он не может найти почту в вашем почтовом ящике  (который вы открыли ранее) с аргументами, которые вы указали, вы увидите  “Не найдено почты с вашими аргументами” в журнале  возвращаемое значение теста будет установлено как «Fail».

Использование вашей новой библиотеки в  robot framework

Теперь, когда вы создали свою библиотеку, все что вам следует сделать для использования ее в  robot framework, это импортировать ее  в часть установок вашего файла:

Library          path/to/your/lib.py

Затем, вы можете вызывать ключевые слова так, как если бы они были ключевыми словами  robot framework.

Собираем все вместе

Вот полный источник  check_mail.py:

import imaplib
 
class check_mail:
 
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'
    __version__ = '0.1'
 
    def open_mail_box(self, server, user, pwd):
        try:
            self.mailbox = imaplib.IMAP4(server)
            self.mailbox.login(user, pwd)
            self.mailbox.select()
        except imaplib.IMAP4.error:
            raise AssertionError('Could not connect to the mailbox')
 
    def check_mail(self, *args):
        r, self.item = self.mailbox.search(None, *args)
        self.item = self.item[0].split()
        if self.item == []:
            raise AssertionError("No mail found")       
 
    def close_mailbox(self):
        self.mailbox.close()

А тестовый случай, с использованием библиотеки, проверяющей присутствует ли новая почта из remote@domain.com  будет выглядеть следующим образом:

#Library
Library		Lib/check_mail.py

*** Test Cases ***

TC test mail [Documentation]
   Open Mail Box  server user password
   Check Mail  UNSEEN  FROM  "remote@domain.com"

Полезные ссылки и информация по RobotFramework