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浅析的更多相关文章

  1. RobotFramework 官方demo Quick Start Guide rst配置文件分析

    RobotFramework官方demo Quick Start Guide rst配置文件分析   by:授客 QQ:1033553122     博客:http://blog.sina.com.c ...

  2. Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors

    在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt ...

  3. Qt5官方demo解析集13——Qt Quick Particles Examples - Image Particles

    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文 Qt5官方demo解析集12--Qt Quic ...

  4. Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters

    此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 前段时间去听了Qt在北京的开发人员大会,感觉QML ...

  5. RF《Quick Start Guide》操作总结

    这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路.在未查看这类官网文档之前,更多的是看其他各种人的博 ...

  6. SMJobBless官方Demo笔记

    SMJobBless是苹果官方提供的用于"MacOS app获取root权限"的demo. 具体思路 使用Security.framework和ServiceManagement. ...

  7. 订餐系统之微信支付,踩了官方demo的坑

        最近一个项目要增加微信支付的功能,想来这个东西出来这么久了,按微信提供的应该可以很快搞定的,结果提供的demo( JS API网页支付)中各种坑,咨询他们的客服,态度倒是非常好,就是解决不了问 ...

  8. SlickUpload Quick Start Guide

    Quick Start Guide The SlickUpload quick start demonstrates how to install SlickUpload in a new or ex ...

  9. Dubbo系列(3)_官方Demo说明

    一.本文目的     通过Dubbo的官方Demo介绍,学会搭建一个简单的Dubbo程序,包括服务端.客户端.接口等. Demo地址:https://github.com/alibaba/dubbo/ ...

随机推荐

  1. 新年放大招:Github 私库免费了!

    据<Github 嫁入豪门>这篇文章刚好半年了,那时候栈长还表示对 Github 的期待,仅仅半年,现在就已经有了巨大改变. 微软果然是豪门,嫁入半年就已经开花结果了,免费私库已全面无限制 ...

  2. Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  3. react native项目启动需要做的操作

    一.启动: 1.查看端口(默认8081是否被占用) netstat -ano   可以查看所有的进程 2.netstat -ano | findstr "8081"  查看某个端口 ...

  4. Maven 概要介绍

    Maven 简介 Apache Maven 是一套软件工程管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven 工程结构 ...

  5. 小程序开发--移动端分辨率与rpx

    首先说一个很有意思的问题:一块720p的屏幕和1080p的屏幕那个大? 这个问题很有代表性,如果手机竖着放,720p=720px*1280px,而1080p=1080px*1920px;那么在宽度上, ...

  6. JavaWeb 并发:FOR UPDATE 实战,监测并解决。

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 针对并发,老生常谈了.目前一个通用的做法有两种:锁机制:1.悲观锁:2.乐观锁. 但是这篇我 ...

  7. Ubuntu 18.04.1 搭建Java环境和HelloWorld

    一.搭建Java环境 系统环境 Ubuntu 18.04.1 JDK 8 IDEA 2018.2 1.下载JDK 官网地址:http://www.oracle.com/technetwork/java ...

  8. shiro源码篇 - 疑问解答与系列总结,你值得拥有

    前言 开心一刻 小明的朋友骨折了,小明去他家里看他.他老婆很细心的为他换药,敷药,然后出去买菜.小明满脸羡慕地说:你特么真幸福啊,你老婆对你那么好!朋友哭得稀里哗啦的说:兄弟你别说了,我幸福个锤子,就 ...

  9. Linux常用性能工具功能、用法及原理(一)

    Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息. 按实现原理分,可分为基于计数器和跟踪以及剖析.含义如下: 计数器 ...

  10. CC2530微处理器接口开发技术——信号灯的设计与实现

    本问主要介绍了CC2530处理器的通用输入/输出接口(GPIO),以及GPIO的位操作,理解GPIO的基本原理和功能,最后使用C语言驱动CC2530的GPIO实现对信号灯的控制. CC2530的GPI ...