如何在每个基于plone.app.robotframework的测试之前创建测试站点结构?

时间:2014-06-23 14:27:45

标签: plone robotframework

在运行Plone机器人测试时,我找不到像setUptearDown这样的方法。

我需要的是在每次测试之前创建一个完整的站点结构。我找到的唯一方法是创建我自己的新机器人关键字,从浏览器本身创建结构,但我不想测试文件夹创建。这将减慢我的测试速度。

我在robotsuite图书馆找到了一些有希望的东西:https://github.com/collective/robotsuite/blob/b52000c65ea96b2be697bf899829c397985fc5aa/src/robotsuite/init.py#L217 但是我不能使它工作:我可以定义一个空的setUp函数,没有Plone上下文。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

首先,您始终可以在基于 plone.app.testing 的测试图层的设置方法中定义测试网站结构。 (有关详细信息,请参阅plone.app.testing的文档。)

除此之外,至少有几种方法可以为基于Selenium测试的 plone.app.robotframework 构建测试站点结构:


第一个是将测试setUp函数作为 RobotTestSuite -class的 setUp -keyword参数传递:

import unittest
import robotsuite

from plone.testing import layered
from my.package.testing import MY_PACKAGE_ROBOT_TESTING

from zope.component.hooks import getSite
from transaction import commit


def mySetUp(testCase=None):
    site = getSite()
    # do stuff
    commit()


def test_suite():
    suite = unittest.TestSuite()
    suite.addTests([
        layered(
            robotsuite.RobotTestSuite('test_something.robot',
                                      setUp=mySetUp),
            layer=MY_PACKAGE_ROBOT_TESTING
        ),
    ])
    return suite

应该不需要显式的tearDown,因为plone.app.testing的功能测试拆解已经恢复了对测试沙箱所做的所有更改。

此功能基于 RobotTestSuite ,用于模仿doctest-module中的DocTestSuite。 setUp-method接受一个参数,即测试用例对象,但由于测试框架在测试框架的某处丢失, getSite 是到达门户网站对象的唯一理智方式。

最后,很高兴知道这种方法只有在机器人框架测试在构建Plone测试层的同一过程中执行时才会起作用(执行 robosuite时就是这种情况 zope.testrunner )。


第二种方法是将 setUp 功能拆分为自定义本地python关键字库。例如,在my/package/testing.py中您可以:

from plone import api
from transaction import commit


class MyPackageKeywords(object):

    def create_stuff(self, stuff_id):
        portal = api.portal.get()
        obj = api.content.create(
            type='Document',
            title='My Stuff',
            container=portal
        )
        commit()
        return obj.absolute_url()

你应该可以像以下一样使用它:

*** Settings ***
...
Library  my.package.testing.MyPackageKeywords

*** Test Cases ***
...
    ${URL} =  Create stuff  stuff_id=my-stuff
    Go to  ${URL}
    Element should contain  css=h1.documentFirstHeading  My Stuff

这与第一种方法具有相同的限制。


第三种可能的方法是使用最近的 plone.app.robotframework 版本中提供的与内容相关的远程关键字在实际的Robot Framework测试套件中创建内容。

简而言之,这是通过在测试图层中加入 REMOTE_LIBRARY_BUNDLE_FIXTURE 并使用创建内容 Fire转换关键字来创建所需的模拟内容。

import unittest
import robotsuite

from plone.app.robotframework.testing import REMOTE_LIBRARY_BUNDLE_FIXTURE
from plone.app.testing import PLONE_FIXTURE
from plone.testing import layered
from plone.testing import z2


PLONE_ACCEPTANCE_TESTING = z2.FunctionalTesting(
    bases=(REMOTE_LIBRARY_BUNDLE_FIXTURE,
           PLONE_FIXTURE,
           z2.ZSERVER_FIXTURE),
    name="Acceptance")


def test_suite():
    suite = unittest.TestSuite()
    suite.addTests([
        layered(
            robotsuite.RobotTestSuite('test_something.robot'),
            layer=PLONE_ACCEPTANCE_TESTING
        ),
    ])
    return suite
*** Settings ***

Resource  plone/app/robotframework/keywords.robot
Resource  Selenium2Screenshots/keywords.robot

Library  Remote  ${PLONE_URL}/RobotRemote

Test Setup  Open test browser
Test Teardown  Close all browsers

*** Test Cases ***

Scenario: View folder contents
    Given a contributor
      and a folder
      and a document inside the folder
     when at the folder listing
     then can see the document title

*** Variables ***

${FOLDER_ID}  a-folder
${DOCUMENT_ID}  a-document

*** Keywords ***

A contributor
    Enable autologin as  Contributor

A folder
    Create content  type=Folder
    ...  id=${FOLDER_ID}
    ...  title=A folder
    ...  description=This is the folder

A document inside the folder
    Create content  type=Document
    ...  container=/${PLONE_SITE_ID}/${FOLDER_ID}
    ...  id=${DOCUMENT_ID}
    ...  title=A document
    ...  description=This is the document
    ...  text=<p><strong>Hello world!</strong></p>

At the folder listing
    Go to  ${PLONE_URL}/${FOLDER_ID}/folder_contents
    Element should be visible  name=folderContentsForm

Can see the document title
    Page should contain  A document
    Capture and crop page screenshot  folder-contents.png  css=#content

请注意,创建内容 -keyword可能还需要使用启用自动登录 -keyword来验证内容创建调用。另请注意,捕获和裁剪页面截图现在位于单独的软件包 robotframework-selenium2screenshots 中。

内容创建关键字尚不完善,可能会在GitHub报告问题。您还可以实施自己的remote python keywords。它们只是简单python类中的方法,它包含在REMOTE_LIBRARY_BUNDLE_FIXTURE中。

最后,另请参阅the good known versions for plone.app.robotframework and friends