• RF《Quick Start Guide》操作总结


         这篇文章之所以会给整理出来,是因为学了一个季度的RF后,再去看官网的这个文档,感触破多,最大的感触还是觉得自己走了不少弯路,还有些是学习方法上的弯路。在未查看这类官网文档之前,更多的是看其他各种人的博客,看齐涛的修炼宝典(无任何恶意,仅表明适合刚入门的测试人员)的方式来学习RF,学的很多知识点都零散且不同的博客对同一个问题还有不同的个人看法。于是后期便开始查看官网文档,学习了Quick Start Guide 文档后,对于一个已入门3个月的测试来说,还是有些收获(可能以前也是自己学的肤浅,呵呵)。下面就从Quick Start Guide中挑选出部分重要的知识点。

         首先在官网下载Quick Start Guide的相关文档(官网:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst),这个文档使用了一个经典的登录应用程序,实际上就一个用python语言写的基于命令的代码。分2个模块:一个模块是服务器端的代码login.py.里面主要有2个类构成UserDataBase和User,User类主要是针对User的属性username,password,status的校验管理。比如密码长度必须是6-12位且由大小写+数字组成。而UserDataBase主要是完成User与数据库(robotframework-quickstart-db.txt)的交互。比如把符合一定规则的用户注册信息保存在数据库中。部分代码如下所示,详细的代码参见:QuickStartGuide-mastersutlogin.py

    class User(object):
        @property
        def password(self):
            return self._password
    
        @password.setter
        def password(self, password):
            self._validate_password(password)
            self._password = password
    
        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 combination 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 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 failed: %s' % err
            else:
                return 'SUCCESS'

           还有一个模块,是封装关键字给RF直接调用的,然后在文件里面又调用了服务器模块login.py来与服务进行交互。部分代码如下,详细代码见:QuickStartGuide-masterlibLoginLibrary.py

    class LoginLibrary(object):
    
        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 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))

         由此可见,这个demo提供以下四个功能:

    • 使用有效的密码创建一个用户。create_user(username, password)
    • 使用有效的用户名和密码登陆。attempt_to_login_with_credentials( username, password)
    • 修改已存在账户的密码。change_password(username, old_pwd, new_pwd)
    • 判断用户的当前状态. status_should_be(expected_status)

        Demo在RF内,首先可以创建一个suit级别的文件,然后导入operatingSystem库(Remove File关键字使用到的库文件)和用户自定义LoginLibrary库(测试服务器模块login.py),拷贝sut到D:python27下,再拷贝LoginLibrary.py到D:python27Lib文件夹下,搭建完后,架构如图所示:

        

    阶段一:简单的测试用例:就用LoginLibrary内提供的关键字进行以下测试.

     

          这个测试用例的第二步和第三步就直接使用了LoginLibrary内提供的关键字进行测试

    阶段二:用户关键字定义

         上图的第一步create valid user 就属于用户自定义的关键字,这个自定义的关键字主要实现了,创建用户,然后判断当前用户状态为success,则就能表现创建的确实为合法的用户。

    阶段三:数据驱动测试用例

        以前没看文档之前,看官网介绍,就是介绍RF支持关键字驱动也支持数据驱动,一直误以为意思是指把测试数据全部写在excel内,然后RF去读取再实现,之前也有尝试过,但是里面的逻辑较为复杂,也一直是一知半解。后面学习完文档后,终于意会到RF所指的数据驱动是个神马意思了。

       Demo里面创建一个测试用例,创建用户时,使用不合法的密码。Demo先把这段逻辑抽成一个用户关键字。实现如下:

      

      该用户自定义关键字的入参为password和error,然后创建一个测试用例:引用之前创建的用户自定义关键字

     

        end~直接在表格写入参即可。这类测试用例,最常用于一些无状态的接口测试项目中。

    阶段四:高级别测试用例

       之所以称为高级别的测试用例,其实我一直还不明白是为什么,就因为可用于编写测试驱动开发的用例么?没想通??这种测试用例主要由不携带实际参数的用户自定义关键字组成。用户自定义关键字有四个,如下所示:

         自定义关键字的变量都直接写好在RF内

        然后使用given-when-then格式创建测试用例:

        这类测试用例主要用于测试驱动开发的场景下.

        在demo里面使用了db文件,这个文件作用就是充当数据库,存储用户的一些信息。Demo里面有提到在每次运行测试用例之前删除这个文件,然后还有就是查询文件里的一些信息。

    运行完后,这个文件是这样的:

        这个文档基本的内容应该就是上面所描述的,从这次文档的学习,总结下自己学到的知识点:

    1. RF内的数据驱动的含义
    2. 高级关键字的使用场景
    3. 系统保留常量和特殊字符常量
    4. Python语言
    5. 阅读英文文档能力

    最后,奉上英文和中文翻译的原文链接(当然最好还是养成阅读英文文档的习惯比较好)。

    英文:https://github.com/robotframework/QuickStartGuide/blob/master/QuickStart.rst

    中文翻译版:

    http://www.cnblogs.com/txw1958/archive/2012/05/10/2494805.html

  • 相关阅读:
    (转)Android系统自带样式(@android:style/)
    Android:安卓资源引用符号的含义
    Android:再按一次退出程序
    Android:实现退出确认对话框
    Android:仿微信开场切换界面
    Android:ViewPager适配器PagerAdapter的使用
    Android:使用ViewPager实现左右滑动切换图片(图上有点点)
    Android:使用ViewPager实现左右滑动切换图片 (简单版)
    inflate方法与findViewById的区别
    Android:自定义标题栏
  • 原文地址:https://www.cnblogs.com/loleina/p/5590945.html
Copyright © 2020-2023  润新知