说白了,任何一种框架的作用就是帮你完成一些基础的工作,使你更加关注于要测试的业务逻辑,而不是关心技术细节,这些技术细节包括用例如何运行、如何组织、日志怎么记录,怎么展现,如何与CI集成等等。
使用RF框架与Jenkins CI工具结合,可以很容易的实现测试的远程部署、运行与结果展现。比起重写造轮子,自己写一套系统,这种方式还是快得多,最适合刚刚起步的项目。
RF能做什么取决于使用什么样的扩展框架,RF提供的默认内置库与外部扩展库,当然也可以自己写扩展库来定制功能。基本提供的库已经可以满足一般的测试需求了,包括对手机端、网页端的自动化测试,还有API接口的测试。
RF文件通常以robot为后缀名,并且提供了很多的编辑工具,方便的进行robot文件的编辑。我使用的是pycharm的RF插件进行编辑,因为需要使用python写大量的扩展库,所以在pycharm里面统一进行robot与py文件的编辑,还是很方便的。或者使用官方的RIDE也是很好的选择,纯图形化界面,方便团队没有开发经验的人参与其中。
1 # 导入Selenium2Library模块
2 from Selenium2Library import Selenium2Library模块
3 from selenium.common.exceptions import StaleElementReferenceException
4 import time
5
6
7 def _get_table_field_value(element, field):
8 return element.find_element_by_xpath("./td[@field=‘" + field + "‘]").text.strip()
9
10 # 继承Selenium2Library
11 class CustomSeleniumLibrary(Selenium2Library):
12 def get_table_row_count(self, table_locator):
13 attempts = 0
14 while True:
15 try:
16 table = self._table_element_finder.find(self._current_browser(), table_locator)
17 return len(table.find_elements_by_xpath("./tbody/tr"))
18 except StaleElementReferenceException:
19 time.sleep(1)
20 if attempts >= 1:
21 raise AssertionError("Cell in table %s could not be found." % table_locator)
22 else:
23 pass
24 attempts += 1
25
26 def get_user_search_results(self, table_locator, row_index):
27 table = self._table_element_finder.find(self._current_browser(), table_locator)
28 ret = []
29 if table is not None:
30 rows = table.find_elements_by_xpath("./tbody/tr")
31 if len(rows) <= 0:
32 return None
33 row_index = int(row_index)
34 if len(rows)-1 < row_index:
35 raise AssertionError("The row index ‘%s‘ is large than row length ‘%s‘." % (row_index, len(rows)))
36 for row in rows:
37 dic = {
38 ‘userId‘: _get_table_field_value(row, ‘userId‘),
39 ‘nickName‘: _get_table_field_value(row, ‘nickName‘),
40 ‘realName‘: _get_table_field_value(row, ‘realName‘),
41 ‘mobile‘: _get_table_field_value(row, ‘mobile‘),
42 ‘idNo‘: _get_table_field_value(row, ‘idNo‘),
43 ‘userType‘: _get_table_field_value(row, ‘userType‘),
44 ‘verifyUserStatus‘: _get_table_field_value(row, ‘verifyUserStatus‘),
45 ‘operator‘: _get_table_field_value(row, ‘operater‘),
46 ‘operateTime‘: _get_table_field_value(row, ‘operateTime‘),
47 }
48 ret.append(dic)
49 return ret[row_index]
50 else:
51 return None
52
53 ...
1 # -*- coding: utf-8 -*-
2
3 from libs.DB_utils.utils import *
4 from libs.request_utils import utils
5 from libs.request_utils import flow_task_manage
6 from libs.global_enum import *
7 from libs.model import user_search_result
8 from robot.libraries.BuiltIn import BuiltIn
9 import time
10
11
12 class VerifyLibrary(object):
13
14 def __init__(self, base_URL, username, dubbo_web_base_URL=None):
15 self.base_URL = base_URL
16 self.username = username
17 self.request_utils = utils.RequestUtil(base_URL, username)
18 self.flow_task_request_utils = flow_task_manage.FlowTaskManage(base_URL, username)
19 self.built_in = BuiltIn()
20 if dubbo_web_base_URL is not None:
21 self.dubbo_web_request_utils = utils.RequestUtil(dubbo_web_base_URL)
22
23 def update_verify_user_role(self, email, dept_id, role_id, amount_limit=5000):
24 real_name = get_verify_user_name_by_email(email)
25 verify_user_id = get_verify_user_id_by_email(email)
26 self.request_utils.login()
27 respOnse= self.request_utils.update_verify_user(real_name, verify_user_id, amount_limit, dept_id, role_id)
28 return response.json()