Приемочное тестирование приложения CherryPy с Robot Framework

Недавно я получил Python Testing Cookbook, автором которой является Greg L. Turnquist и с радостью прочитал «рецепты» приемочного тестирования с использованием Robot Framework. На работе мы используем этот инструмент уже несколько недель, и, хочу сказать, результаты просто отличны. Грег показывает как тестировать веб-приложение, используя расширение библиотеки Selenium для Robot Framework и я думаю будет интересно продемонстрировать как протестировать приложение CherryPy, следуя его рецепту. Итак, начнем.

Во-первых, несколько требований:

{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }$ mkvirtualenv --distribute --no-site-packages --unzip-setuptools acceptance (acceptance)$ pip install cherrypy (acceptance)$ pip install robotframework (acceptance)$ pip install robotframework-seleniumlibrary{/syntaxhighlighter}

Давайте определим простое приложение CherryPy application, которое показывает вводимый текст при печати сообщения. При нажатии кнопки «отправить», сообщение отправляется на сервер и возвращается назад в реальном виде. На самом деле, это эхо-сообщение.

{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }import cherrypy

all = [‘Echo’]

class Echo(object):
@cherrypy.expose
def index(self):
return “”“<html>
<head><title>Robot Framework Test for CherryPy</title></head>
<body>
<form method=“post” action=”/echo">
<input type=“text” name=“message” />
<input type=“submit” />
</form>
</body>
</html>“”"

@cherrypy.expose
def echo(self, message):
    return message

if name == ‘main’:
cherrypy.quickstart(Echo()){/syntaxhighlighter}

Cохраните указанный выше код в модуле под названием myapp.py

Далее, мы создаем расширение для Robot Framework, которое будет управлять CherryPy. Сохраните следующее в модуле CherryPyLib.py. Важно не изменять имя, так как Robot Framework ожидает, что имена модуля и его класса будут совпадать.

{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }import imp
import os, os.path

import cherrypy

class CherryPyLib(object):
def setup_cherrypy(self, conf_file=None):
“”"
Configures the CherryPy engine and server using
the built-in ‘embedded’ environment mode.

    If provided, `conf_file` is a path to a CherryPy
    configuration file used in addition.
    """
    cherrypy.config.update({"environment": "embedded"})
    if conf_file:
        cherrypy.config.update(conf_file)            

def start_cherrypy(self):
    """
    Starts a CherryPy engine.
    """
    cherrypy.engine.start()

def exit_cherrypy(self):
    """
    Terminates a CherryPy engine.
    """
    cherrypy.engine.exit()

def mount_application(self, appmod, appcls, directory=None):
    """
    Mounts an application to be tested. `appmod` is the name
    of a Python module containing `appcls`. The module is
    looked for in the given directory. If not provided, we use
    the current one instead.
    """
    directory = directory or os.getcwd()
    file, filename, description = imp.find_module(appmod, [directory])
    mod = imp.load_module(appmod, file, filename, description)
    if hasattr(mod, appcls):
        cls = getattr(mod, appcls)
        app = cls()
        cherrypy.tree.mount(app)
    else:
        raise ImportError, "cannot import name %s from %s" % (appcls, appmod){/syntaxhighlighter}</p><p>Примите во внимание, что мы запускаем и останавливаем сервер <strong>CherryPy </strong>в ходе самого теста, что означает, что вам не нужно запускать его отдельно. Просто отлично.</p><p>В конце концов, давайте напишем действенный приемочный тест для того, чтобы  проверить правильность общего рабочего цикла эхо сообщения, используя наше маленькое приложение.</p><p>{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }***Settings***

Library SeleniumLibrary
Library CherryPyLib
Suite Setup Start Dependencies
Suite Teardown Shutdown Dependencies
Test Setup Mount Application myapp Echo

Variables
${MSG} Hello World
${HOST} http://localhost:8080/

Test Cases
Echo ${MSG}
Open Browser ${HOST}
Input text message ${MSG}
Submit form
Page Should Contain ${MSG}
Close All Browsers

Keywords
Start Dependencies
Setup Cherrypy
Start CherryPy
Start Selenium Server
Sleep 3s

Shutdown Dependencies
Stop Selenium Server
Exit CherryPy{/syntaxhighlighter}

Сохраните вышеуказанный тест в файл под названием testmyapp.txt. Наконец, вы можете провести тест, следующим образом:

{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }(acceptance)$ pybot --pythonpath . testmyapp.txt{/syntaxhighlighter}

Это запустит CherryPy, прокси сервер Selenium и Firefox в рамках которого будет производиться тестовый случай. Просто, элегантно и эффективно.