是否可以在 Python 中编写机器人框架测试(不是关键字)?

Posted

技术标签:

【中文标题】是否可以在 Python 中编写机器人框架测试(不是关键字)?【英文标题】:Is it possible to write Robot Framework tests (not keywords) in Python? 【发布时间】:2014-05-21 15:59:07 【问题描述】:

是否可以用 Python 而不是 .txt 格式编写 Robot Framework 测试?

在幕后,.txt 测试似乎被pybot 转换为 Python,所以我希望这只是导入正确的库并从正确的类继承的问题,但我没有能够弄清楚如何做到这一点。

(我们已经有很多套件,并且有两种格式的关键字,但有时 RF 语法使得在 Python 中做简单的事情变得非常困难。我知道可以为每个套件编写一个 Python 关键字test plus 'wrap' setup 和 teardown 功能相同,但看起来很麻烦。)

【问题讨论】:

这也是我认为射频在这个因素中很糟糕的原因。它的优点包括灵活的设置拆卸方法、测试执行控制、漂亮的报告。但是用 RF“语言”编写测试用例?它看起来很简单,但实际上使事情变得更加复杂和肮脏。 【参考方案1】:

Robot 在运行测试用例之前不会在后台将它们转换为 python。相反,它解析测试用例,然后遍历每个关键字,调用实现关键字的代码。从来没有一个阶段有测试用例的完全纯 python 表示。

不可能在 python 中编写测试,并通过提供的测试运行程序让这些测试与传统的机器人测试一起运行。就像您在问题中所说的那样,您唯一的选择是将单个测试用例的所有逻辑放在一个关键字中,然后从测试用例中调用该关键字。

可以仅通过已发布的 API 在 python 中创建和执行测试。这可能不是您真正想要的,因为最终您仍在创建关键字,您只是通过 python 创建它们。

from robot.api import TestSuite

suite = TestSuite('Activate Skynet')
suite.imports.library('OperatingSystem')
test = suite.tests.create('Should Activate Skynet', tags=['smoke'])
test.keywords.create('Set Environment Variable', args=['SKYNET', 'activated'], type='setup')
test.keywords.create('Environment Variable Should Be Set', args=['SKYNET'])

上面的例子取自这里:

http://robot-framework.readthedocs.org/en/2.8.1/autodoc/robot.running.html

【讨论】:

感谢您为我澄清这一点【参考方案2】:

好吧,只要你用 python 编写测试的逻辑,你就不应该关心你的 python 代码是代表测试还是关键字。

您能做的最好的事情就是将一些 html 表格保留为机器人格式。每一行都是对关键字的调用。关键字可以在 python 中实现,并且在逻辑上代表一个完整的测试(尽管在机器人术语中它仍然是一个“关键字”)。

This post 展示了如何从 Python 代码访问机器人上下文。

机器人变量

BuiltIn().get_variable_value("$USERNAME")

java 关键字

从 com.mycompany.myproject.testtools 导入 LoginRobotKeyword LoginRobotKeywords().login(user, pwd)

机器人关键字 BuiltIn().run_keyword("检查用户连接", user)

【讨论】:

【参考方案3】:

Robotframework 不支持直接在 python 中编写测试用例。我已经提交了增强 PR,在这里查看

https://github.com/robotframework/robotframework/issues/3128

但我已经尝试通过将所有测试用例逻辑移动到 python 代码来做到这一点,并使 RF 测试用例成为它们的入口点。

这是一个例子。

我们可以创建一个 python 文件来包含所有测试逻辑和设置/拆卸逻辑,像这样

# *** case0001.py *****
from SchoolClass import SchoolClass
schCla = SchoolClass()

class case0001:

    def steps(self):
        print('''\n\n***** step 1 ****  add school class \n''')
        self.ret1 = schCla.add_school_class('grade#1', 'class#1', 60)
        assert self.ret1['retcode'] == 0



        print('''\n\n***** step 2 ****  list school class to check\n''')

        ret = schCla.list_school_class(1)
        schCla.classlist_should_contain(ret['retlist'],
                                    'grade#1', 
                                    'class#1',
                                    60,
                                    self.ret1['id'])


    def setup(self):
        pass

    def teardown(self):
        schCla.delete_school_class(self.ret1['id'])

然后我们创建一个机器人文件。其中所有 RF 测试用例都采用相同的形式,并且只是作为上述 python 测试用例的入口点。

喜欢这个

*** Settings ***
Library    cases/case0001.py   WITH NAME  C000001
Library    cases/case0002.py   WITH NAME  C000002


*** Test Cases ***

add class - tc000001
    [Setup]   C000001.setup
    C000001.steps
    [Teardown]    C000001.teardown

add class - tc000002
    [Setup]   C000002.setup
    C000002.steps
    [Teardown]    C000002.teardown

您可以看到,通过这种方式,RF 测试用例是相似的。我们甚至可以创建一个工具来通过扫描 Python 测试用例来自动生成它们。

【讨论】:

以上是关于是否可以在 Python 中编写机器人框架测试(不是关键字)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在画布内定位元素以进行机器人框架自动化测试?

在机器人框架中的 FOR 循环中导入库

迭代测试机器人框架

如何在机器人框架中并行运行多个测试套件上的多个测试用例 | Python

机器人框架:为整个测试套件运行设置

如何在机器人框架中访问套件中的所有测试