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

В первых двух уроках  (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'
<p>Вы уже создали свою первую библиотеку &nbsp;(Да !), а теперь давайте поможем ей выполнять определенный действия.</p>

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

<p>У нас есть:</p><p>

import imaplib

class check_mail:

ROBOT_LIBRARY_SCOPE = 'GLOBAL'
__version__ = '0.1'
</p><h2>Ключевые слова для Robot Framework </h2>

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

<h2>Аргументы</h2>

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

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

def many_args(*args):
print args

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

def default_arg (arg1, arg2=‘default’):
print arg1, arg2

</p><h2>Ошибки </h2>

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

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

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”)

</p><p>Этот пример будет вызывать поиск по методу &nbsp;<a href="http://docs.python.org/library/imaplib.html">imaplib</a>. В случае, если он не может найти почту в вашем почтовом ящике &nbsp;(который вы открыли ранее) с аргументами, которые вы указали, вы увидите &nbsp;“Не найдено почты с вашими аргументами” в журнале&nbsp; возвращаемое значение теста будет установлено как «Fail».</p>

<p>Использование вашей новой библиотеки в &nbsp;robot framework</p>

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

<p><strong>Library&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; path/to/your/lib.py</strong></p>

<p>Затем, вы можете вызывать ключевые слова так, как если бы они были ключевыми словами &nbsp;robot framework.</p>

<h2>Собираем все вместе </h2>

<p>Вот полный источник &nbsp;check_mail.py:</p><p>

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()
</p><p>А тестовый случай, с использованием библиотеки, проверяющей присутствует ли новая почта из <a href="mailto:remote@domain.com">remote@domain.com</a> &nbsp;будет выглядеть следующим образом:</p><p>

#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

</p>