日期:2014-05-20  浏览次数:21003 次

(二) robot framework - variable file
一,文件中创建variable的两种方式
1) 直接创建:
例子:
VARIABLE = "An example string"   = ${VARIABLE}
INTEGER = 42   = ${INTEGER}
STRINGS = ["one", "two", "kolme", "four"] =  ${STRINGS}
全是scalar类型的variable, 要创建List类型的variable就需要以LIST__ (注意双下划线)开头来命名variable:
LIST__STRINGS = ["list", "of", "strings"]  = @{STRINGS}

还支持创建对象类型的variable,如:
MAPPING = {'one': 1, 'two': 2}    -- 创建dictionary variable  = ${MAPPING}
class MyObject:                  --创建一个类
    def __init__(self, name):
        self.name = name
OBJ1 = MyObject('John')      
OBJ2 = MyObject('Jane')        -创建2个类的对象


此外,还可以动态创建variable:
RANDOM_INT = random.randint(0, 10);
if time.localtime()[3] > 12:
    AFTERNOON = True
else:
    AFTERNOON = False

注1: 通常全局的大写,非全局的小写;
注2: 以下划线_开头的属性不被识别为variable;
注3: 在variable文件中提到的所有不以下划线开头的属性都被认为是variable,可以使用添加下划线的方式来过滤它们, 也可以使用__all__ (双下滑)来将要定义为variable的加进去,如:__all__ = ['AREA1', 'AREA2'],那么只有area1和area2被认为是variable;

2) 从方法或函数中获得返回值的方式 get_variables(),存储结构是python的dictionary 或 java的map;如下例子和1)中的第一个例子效果一样:
def get_variables():
    variables = { "VARIABLE": "An example string",
                  "INTEGER": 42,
                  "STRINGS": ["one", "two", "kolme", "four"],
                  "LIST__STRINGS": ["list", "of", "strings"]
                 }
    return variables

java实现版本:
public Map getVariables() {
        HashMap variables = new HashMap();
        variables.put("VARIABLE", "An example string");
        variables.put("INTEGER", 42);
        variables.put("STRINGS", ["one", "two", "kolme", "four"]);
        variables.put("LIST__STRINGS",["list", "of", "strings"]);
        return variables;
    }

此外,get_variables()也可以接受参数,通常可以用来进行选择导入哪个variable file或者variable value,如下:
variables1 = { 'a': 'Scalar variable',
               'LIST__a': ['List','variable'] }
variables2 = { 'a' : 'Some other value',
               'LIST__a': ['Some','other','value'],
               'extra': 'variables1 does not have this at all' }

def get_variables(arg):
    if arg == 'one':
        return variables1
    else:
        return variables2


二,一些规则
- 当找不到导入的variable文件时,会去python PATH下面找;
- 如果多个引入的variable文件中含有相同的变量名,那么最早的那个将被采用;
- cmd下设置的变量将覆盖文件中的同名variable;
- cmd上导入variable文件:
(--variablefile myvariables.py
--variablefile path/variables.py
--variablefile /absolute/path/common.py
--variablefile taking_arguments.py:arg1:arg2)
此时的variable scope是全局的;

三, 采用java class和python class 来实现 variable files:
一些rules:
1) Python class的名字必须和module的名字相同;
2) java class必须处于默认包中;
3) java class的路径必须以.java或.class结尾,并且两种文件都要存在;

例子-1:创建类属性 ${VARIABLE},@{LIST} 和对象属性 ${ANOTHER VARIABLE}
class StaticPythonExample(object):    --python版本
    variable = 'value'
    LIST__list = [1, 2, 3]
    _not_variable = 'starts with an underscore'

    def __init__(self):
        self.another_variable = 'another value'

public class StaticJavaExample {          -------java版本
    public static String variable = "value";
    public static String[] LIST__list = {1, 2, 3};
    private String notVariable = "is private";
    public String anotherVariable;

    public StaticJavaExample() {
        anotherVariable = "another value";
    }
}

例子-2:
class DynamicPythonExample(object):   --python

    def get_variables(self, *args):
        return {'dynamic variable': ' '.join(args)}

import java.util.Map;
import java.util.HashMap;

public class DynamicJavaExample {     -java

    public Map<String, String> getVariables(String arg1, String arg2) {
        HashMap<String, String> variables = new HashMap<String, String>();
        variables.put("dynamic variable", arg1 + " " + arg2);
        return variables;
    }
}