RobotFramework RobotFramework官方demo Quick Start Guide浅析
RobotFramework官方demo Quick Start Guide浅析
by:授客 QQ:1033553122
博客:http://blog.sina.com.cn/ishouke
欢迎加入软件性能测试交流QQ群:7156436
目录
1、 开发环境 1
2、 安装robotframework 1
3、 脚本分析 2
sut/login.py 2
Lib/LoginLibrary.py 6
运行rst配置文件 9
1、 开发环境
win7 x64
PyCharm 4.0.5
Python 3.3.2
robotframework-master.zip
下载地址1:https://github.com/robotframework/robotframework
下载地址2:http://pan.baidu.com/s/1dE2nz9Z
QuickStartGuide-master.zip
下载地址1:https://github.com/robotframework/QuickStartGuide
下载地址2:http://pan.baidu.com/s/1gfiMS5l
(因为官方的demo有些bug,在其基础上做了些修改)
2、 安装robotframework
下载.zip压缩文件后解压安装
D:\Program Files\python33\Lib\site-packages>robotframework-master>python setup.py
修改path环境变量,增加指向robot的路径
D:\Program Files\python33\Scripts
参考连接:https://github.com/robotframework/robotframework/blob/master/INSTALL.rst
3、 脚本分析
sut/login.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from __future__ import print_function
import os.path
import sys
import tempfile
import study
DATABASE_FILE = os.path.join(tempfile.gettempdir(), 'robotframework-quickstart-db.txt')
class User(object):
def __init__(self, username, password, status='Inactive'):
self._validate_password(password)
self._username = username
self._password = password
self._status = status
@property
def username(self):
return self._username
@username.setter
def username(self, username):
self._username = username
@property
def password(self):
return self._password
@password.setter
def password(self, password):
self._validate_password(password)
self._password = password
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
def _validate_password(self, password):
if not (7 <= len(password) <= 12):
raise ValueError('Password must be 7~12 characters long')
if not self._validate_password_chars(password):
raise ValueError('Password must be a combiantion of lowercase and'
'uppercase letters and numbers')
def _validate_password_chars(self, password):
has_lower = has_upper = has_number = False
for char in password:
if char.islower():
has_lower = True
elif char.isupper():
has_upper = True
elif char.isdigit():
has_number = True
else:
return False
return has_lower and has_upper and has_number
class UserDataBase(object):
def __init__(self, db_file=DATABASE_FILE):
self.users = self._read_users(db_file)
self.db_file = db_file
def _read_users(self, path):
users = {}
if os.path.isfile(path): #判断所给路径path是否指向一个文件
with open(path) as file:
for row in file.readlines():
user = User(*row.rstrip('\r\n').split('\t'))
users[user.username] = user
return users
def create_user(self, username, password):
try:
user = User(username, password)
except ValueError as err:
return 'Creating user failed: %s' % err
self.users[user.username] = user
return 'SUCCESS'
def login(self, username, password):
if self._is_valid_user(username, password):
self.users[username].status = 'Active'
return 'Logged In'
return 'Access Denied'
def _is_valid_user(self, username, password):
return (username in self.users and self.users[username].password == password)
def change_password(self, username, old_pwd, new_pwd):
try:
if not self._is_valid_user(username, old_pwd):
raise ValueError('Access Denied')
self.users[username].password = new_pwd
except ValueError as err:
return 'Changing password faild:%s' % err
else:
return 'SUCCESS'
def save(self):
with open(self.db_file, 'w') as file:
for user in self.users.values():
file.write('%s\t%s\t%s\n' % (user.username, user.password, user.status))
def truncate(self):
with open(self.db_file, 'w') as file:
file.truncate()
return 'SUCCESS'
def __enter__(self):
return self
def __exit__(self, *exec_info):
self.save()
def login(username, password):
with UserDataBase() as db:
print(db.login(username, password))
def create_user(username, password):
with UserDataBase() as db:
print(db.create_user(username, password))
def change_password(username, old_pwd, new_pwd):
with UserDataBase() as db:
print(db.change_password(username, old_pwd, new_pwd))
def truncate():
with UserDataBase() as db:
print(db.truncate())
def help():
print('Usage: %s { create | login | change-password | truncate | help}' % os.path.basename(sys.argv[0]))
if __name__ == '__main__':
actions = {'create': create_user, 'login': login, 'change-password': change_password, 'truncatefile': truncate, 'help': help}
try:
study.testt()
action = sys.argv[1]
except IndexError:
action = 'help'
args = sys.argv[2:]
try:
actions[action](*args)
except (KeyError, TypeError):
help()
运行脚本:
1)登录用户帐号不存在、密码错误
E:\Projects\studyproject>python sut/login.py login nobody P4ssw0rd
Access Denied
2)创建用户账户
E:\Projects\studyproject>python sut/login.py create fred P4ssw0rd
SUCCESS
3)用创建的用户登录
E:\Projects\studyproject>python sut/login.py login fred P4ssw0rd
Logged In
4)创建用户时,用户密码必须包含7-12字符
E:\Projects\studyproject>python sut/login.py create fred short
Creating user failed: Password must be 7~12 characters long
5)创建用户时,用户密码必须包含大小写字母和数字字符
E:\Projects\studyproject>python sut/login.py create fred invalid
Creating user failed: Password must be a combiantion of lowercase anduppercase l
etters and numbers
6)修改用户密码,提供错误的原始密码
E:\Projects\studyproject>python sut/login.py change-password fred wrong NewP4ss
Changing password faild:Access Denied
7)修改用户密码,提供正确的原始密码
E:\Projects\studyproject>python sut/login.py change-password fred P4ssw0rd NewP4ss
SUCCESS
Lib/LoginLibrary.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os.path
import subprocess
import sys
class LoginLibrary(object):
def __init__(self):
self._sut_path = os.path.join(os.path.dirname(__file__),
'..', 'sut', 'login.py')
self._status = ''
def create_user(self, username, password):
self._run_command('create', username, password)
def change_password(self, username, old_pwd, new_pwd):
self._run_command('change-password', username, old_pwd, new_pwd)
def attempt_to_login_with_credentials(self, username, password):
self._run_command('login', username, password)
def login(self, username, password):
self._run_command('login', username, password)
def status_should_be(self, expected_status):
if expected_status != self._status:
raise AssertionError("Expected status to be '%s' but was '%s'."
% (expected_status, self._status))
def truncate(self):
self._run_command('truncatefile')
def _run_command(self, command, *args):
command = [sys.executable, self._sut_path, command] + list(args)
process = subprocess.Popen(command, universal_newlines=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
self._status = process.communicate()[0].strip()
QuickStart.rst文件
.. code:: robotframework
*** Test Cases ***
User can create an account and log in
[Tags] mytag
Create Valid User fred P4ssw0rd
Attempt to Login with Credentials fred P4ssw0rd
Status Should Be Logged In
Invalid password
[Template] Creating user with invalid password should fail
abCD5 ${PWD INVALID LENGTH}
abCD567890123 ${PWD INVALID LENGTH}
123DEFG ${PWD INVALID CONTENT}
abcd56789 ${PWD INVALID CONTENT}
AbCdEfGh ${PWD INVALID CONTENT}
abCD56+ ${PWD INVALID CONTENT}
User can change password
Given A user has a valid account
When she changes her password
Then she can log in with the new password
And she cannot use the old password anymore
*** Keywords ***
Create valid user
[Arguments] ${username} ${password}
Create user ${username} ${password}
Status should be SUCCESS
Creating user with invalid password should fail
[Arguments] ${password} ${error}
Create user example ${password}
Status should be Creating user failed: ${ERROR}
A user has a valid account
Create valid user ${USERNAME} ${PASSWORD}
She changes her password
Change password ${USERNAME} ${PASSWORD} ${NEW PASSWORD}
Status should be SUCCESS
She can log in with the new password
Login ${USERNAME} ${NEW PASSWORD}
She cannot use the old password anymore
Attempt to login with credentials ${USERNAME} ${PASSWORD}
Status should be Access Denied
Clear Login Database
Truncate
*** Variables ***
${USERNAME} janedoe
${PASSWORD} J4n3D0e
${error} 123456
${NEW PASSWORD} e0D3n4J
${DATABASE FILE} ${TEMPDIR}${/}robotframework-quickstart-db.txt
${PWD INVALID LENGTH} Password must be 7-12 characters long
${PWD INVALID CONTENT} Password must be a combination of lowercase and uppercase letters and numbers
${ERROR} Creating user failed: Password must be 7-12 characters long
*** Settings ***
Suite Setup Clear Login Database
Test Teardown Clear Login Database
Force Tags quickstart
Default Tags example smoke
Library OperatingSystem
Library ../Lib/LoginLibrary.py
__ `Creating test libraries`_
运行rst配置文件
E:\Projects\studyproject>robot QuickStart.rst
robot QuickStart.rst 到运行login.py分析
Demo大致的思路是这样的:
解析用户关键字 -> 查找函数关键字 -> 函数关键字对应的类库函数 -> 运行关键字(通过特定指令,也可以理解为关键字) -> 找到需要执行的模块函数 -> 在模块函数中进行对象操作,管理
这里_run_command通过Popen来执行执行模块中的函数
个人理解,运行robot QuickStart.rst 时,可能也是构造了一个类库对象,类似如下:
obj = LoginLibrary(),有对象后,就可以调用方法了:
obj.create_user('username', 'password')
需要注意.rst文件中关键词和类库函数之间的映射关系:关键词中的空格等同类库函数名称中的下划线 _,一个空格可以对应多个下划线,一个下划线似乎可以对应多个关键词单词之间的空格,不分字母大小写。
参考连接:
https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst
网盘连接分享:RobotFramework官方demo Quick Start
Guide浅析
RobotFramework RobotFramework官方demo Quick Start Guide浅析的更多相关文章
- RobotFramework 官方demo Quick Start Guide rst配置文件分析
RobotFramework官方demo Quick Start Guide rst配置文件分析 by:授客 QQ:1033553122 博客:http://blog.sina.com.c ...
- Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors
在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt ...
- Qt5官方demo解析集13——Qt Quick Particles Examples - Image Particles
本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文 Qt5官方demo解析集12--Qt Quic ...
- Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters
此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 前段时间去听了Qt在北京的开发人员大会,感觉QML ...
- RF《Quick Start Guide》操作总结
这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路.在未查看这类官网文档之前,更多的是看其他各种人的博 ...
- SMJobBless官方Demo笔记
SMJobBless是苹果官方提供的用于"MacOS app获取root权限"的demo. 具体思路 使用Security.framework和ServiceManagement. ...
- 订餐系统之微信支付,踩了官方demo的坑
最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...
- SlickUpload Quick Start Guide
Quick Start Guide The SlickUpload quick start demonstrates how to install SlickUpload in a new or ex ...
- Dubbo系列(3)_官方Demo说明
一.本文目的 通过Dubbo的官方Demo介绍,学会搭建一个简单的Dubbo程序,包括服务端.客户端.接口等. Demo地址:https://github.com/alibaba/dubbo/ ...
随机推荐
- 新年放大招:Github 私库免费了!
据<Github 嫁入豪门>这篇文章刚好半年了,那时候栈长还表示对 Github 的期待,仅仅半年,现在就已经有了巨大改变. 微软果然是豪门,嫁入半年就已经开花结果了,免费私库已全面无限制 ...
- Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- react native项目启动需要做的操作
一.启动: 1.查看端口(默认8081是否被占用) netstat -ano 可以查看所有的进程 2.netstat -ano | findstr "8081" 查看某个端口 ...
- Maven 概要介绍
Maven 简介 Apache Maven 是一套软件工程管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven 工程结构 ...
- 小程序开发--移动端分辨率与rpx
首先说一个很有意思的问题:一块720p的屏幕和1080p的屏幕那个大? 这个问题很有代表性,如果手机竖着放,720p=720px*1280px,而1080p=1080px*1920px;那么在宽度上, ...
- JavaWeb 并发:FOR UPDATE 实战,监测并解决。
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 针对并发,老生常谈了.目前一个通用的做法有两种:锁机制:1.悲观锁:2.乐观锁. 但是这篇我 ...
- Ubuntu 18.04.1 搭建Java环境和HelloWorld
一.搭建Java环境 系统环境 Ubuntu 18.04.1 JDK 8 IDEA 2018.2 1.下载JDK 官网地址:http://www.oracle.com/technetwork/java ...
- shiro源码篇 - 疑问解答与系列总结,你值得拥有
前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...
- Linux常用性能工具功能、用法及原理(一)
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息. 按实现原理分,可分为基于计数器和跟踪以及剖析.含义如下: 计数器 ...
- CC2530微处理器接口开发技术——信号灯的设计与实现
本问主要介绍了CC2530处理器的通用输入/输出接口(GPIO),以及GPIO的位操作,理解GPIO的基本原理和功能,最后使用C语言驱动CC2530的GPIO实现对信号灯的控制. CC2530的GPI ...