在运行Plone机器人测试时,我找不到像setUp
和tearDown
这样的方法。
我需要的是在每次测试之前创建一个完整的站点结构。我找到的唯一方法是创建我自己的新机器人关键字,从浏览器本身创建结构,但我不想测试文件夹创建。这将减慢我的测试速度。
我在robotsuite图书馆找到了一些有希望的东西:https://github.com/collective/robotsuite/blob/b52000c65ea96b2be697bf899829c397985fc5aa/src/robotsuite/init.py#L217
但是我不能使它工作:我可以定义一个空的setUp
函数,没有Plone上下文。
我该怎么做?
答案 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。