Robot Framework中使用C库

Stella981
• 阅读 578

Robot 框架如何使用C库

介绍

这里通过一个简单的例子,演示如何在Robot Framework 的测试库中使用C语言。我们使用Python标准库中的ctypes模块(对于早期Python版本可能未集成,需要另行安装),该模块需要调用C代码编写的共享库。当前的例子我仅在OSX上实现与测试,对于Unix和Linux平台大同小异,对于Windows平台,仅仅需要注意共享库的格式和调用方式即可,当前未做其他平台相关测试。

共享库

第一步,我们需要编写C的共享库。

我们编写的例子是一个非常简单的登录系统(login.c), 通过输入的用户名和密码进行验证,并返回验证结果。这里有两组合法的用户名密码组合:demo/mode和john/long.其他组合都是错误的。下面是login.c的完整代码:

/*
Simple system that validates passwords and user names. There are two users in
system with valid user name and password. "demo mode" and "john long". All
other user names are invalid. Except that there are bugs. Can you spot them?
*/

#include <string.h>
#define NR_USERS 2

struct User {
    const char* name;
    const char* password;
};
const struct User VALID_USERS[NR_USERS] = { "john", "long", "demo", "mode" };

int validate_user(const char* name, const char* password) {
    int i;
    for (i = 0; i < NR_USERS; i++) {
        if (0 == strncmp(VALID_USERS[i].name, name, strlen(VALID_USERS[i].name)))
            if (0 == strncmp(VALID_USERS[i].password, password,     strlen(VALID_USERS[i].password)))
                return 1;
       }
        return 0;
}

我们将这个文件编译成共享库liblogin.so. 在当前目录下,我们创建Makefile文件。 Makefile编写如下:

CC=gcc
SRC=login.c
SO=liblogin.so

$(SO): $(SRC)
    $(CC) -fPIC -shared -o $(SO) $(SRC)

clean:
    rm -f $(SO)

我们在当前目录执行make命令,就创建了共享库liblogin.so. 后面我们将介绍如何编写Robot Framework测试库来调用我们的C共享库。

测试库

在这里,我们按照Robot框架的规范,来编写测试库LoginLibrary.py. LoginLibrary是一个简单的测试库,通过ctypes模块来与底层的C共享库进行交互。我们这个库仅仅提供了一个关键字就是 Check User.

下面是LoginLibrary.py的完整代码:

"""Robot Framework test library example that calls C code.

This example uses Python's standard `ctypes` module, which requires
that the C code is compiled into a shared library.

It is also possible to execute this file from the command line 
to test the C code manually.
"""

from ctypes import CDLL, c_char_p

LIBRARY = CDLL('./liblogin.so')  # On Windows we'd use '.dll'


def check_user(username, password):
    """Validates user name and password using imported shared C library."""
    if not LIBRARY.validate_user(c_char_p(username), c_char_p(password)):
        raise AssertionError('Wrong username/password combination')


if __name__ == '__main__':
    import sys
    try:
        check_user(*sys.argv[1:])
    except TypeError:
         print 'Usage:  %s username password' % sys.argv[0]
    except AssertionError, err:
        print err
    else:
        print 'Valid password'

if __name__ == '__main__' 语句块不是用于测试库的,我们在这里写是为了方便测试测试库,我们可以执行如下的测试命令:

python LoginLibrary.py demo mode
python LoginLibrary.py demo invalid

来验证我们的测试库编写是否正确,不过对于正式的测试库,我们需要进行单元测试utest和验收测试atest.这里就不做过多介绍了。编写好测试库以后,我们就可以利用测试库提供的关键字编写用例了。

测试用例

我们按照Robot框架的规范,编写测试用例login_tests.robot, 用例完整代码如下所示:

*** Settings ***
Library           LoginLibrary.py

*** Test Case ***
Validate Users
    [Template]    Check Valid User
    johns    long
    demo     mode

Login With Invalid User Should Fail
    [Template]    Check Invalid User
    de          mo
    invalid     invalid
    long        invalid
    ${EMPTY}    ${EMPTY}

*** Keyword ***
Check Valid User
    [Arguments]    ${username}    ${password}
    Check User    ${username}    ${password}

Check Invalid User
    [Arguments]    ${username}    ${password}
    Run Keyword And Expect Error    Wrong username/password combination    Check     User    ${username}    ${password}

我们的测试集包含了所有的测试情况,包括独立的有效登录测试和无效登录测试。 注意,尽管我们的测试用例文件以显示的.robot扩展结尾,它实际上也是文本文件。我们以.txt结尾,Robot框架同样可以执行。用例编写完了,我们开始执行测试用例。

执行测试

首先要确保已经安装了Robot Framework了,这里我就不介绍怎么安装了,相信大家应该都安装成功了。通过pybot --version查看即可。

我们在控制台上输入如下命令,执行测试:

>pybot login_tests.robot

pybot命令有很多参数可选,这里为了方便,我们就选用默认即可。

执行结果如下:

==============================================================================
Login Tests                                                                   
==============================================================================
Validate Users                                                        | PASS |
------------------------------------------------------------------------------
Login With Invalid User Should Fail                                   | PASS |
------------------------------------------------------------------------------
Login Tests                                                           | PASS |
2 critical tests, 2 passed, 0 failed
2 tests total, 2 passed, 0 failed
==============================================================================
Output:  ../output.xml
Log:     ../log.html
Report:  ../report.html

通过查看输出的html日志和报告文件,我们可以查看用例的执行情况。

至此,我们就简单的介绍完了如何在Robot Framework测试库中调用C库的用法。

点赞
收藏
评论区
推荐文章
浅梦一笑 浅梦一笑
2年前
我惊了,python一行代码玩游戏!!!!
给IT入门加星标,提升编程技能freepythongames,一行代码就能进入使用Python开发的小游戏快乐玩耍!安装pip install freegamesPython包括随您的安装一起分发的大量标准库。标准库有一个称为Turtle的模块,这是一种向普通人介绍python编程的流行方法。今天介绍的所有游戏都是使用Python及其Turtle模块实现的。
Stella981 Stella981
2年前
Go语言,在Ubuntu9.10和Windows安装
工作环境:Ubuntu9.10A、安装C语言工具Go的工具链采用C语言编写,构建需要安装以下开发工具:GCC,C语言标准库,theparsergeneratorBison,make,awk,和ed(编辑器).对于OSX系统,以上工具是Xcode的一部分。对于Ubuntu/Debian系统,运
Wesley13 Wesley13
2年前
Vala 多用途库制作
库可以通过JavaScript,Python,Lua,Ruby中的gi模块调用valac编译时先生成对应的C文件然后再交给gcc编译所生成的共享库与C编译生成库一致(Cconventionfunctioncall)库制作过程中涉及主要文件类型:.so共享库.h  共享库描述文件(Cconvention).
Stella981 Stella981
2年前
Python 数据库操作
Python数据库操作一、前言数据库是应用程序保存数据的一个重要手段,因此学习python语言的数据库操作也是非常重要的内容。今天我们就来分享pymysql模块的使用。二、数据库基本操作2.1安装PyMySQL模块我使用的是Python3.x版本,我们可以通过
Stella981 Stella981
2年前
Python常用模块
一、什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。  但其实import加载的模块分为四个通用类别:   1使用python编写的代码(.py文件)  2已被编译为共享库或DLL的C或C扩展  3包好一组模块的包  4使用C编写并链接到
Stella981 Stella981
2年前
Python中的参数传递与解析
Python传递命令行参数Python的命令行参数传递和C语言类似,都会把命令行参数保存到argv的变量中。对于python而言,argv是sys模块中定义的一个list。与C语言不同的是,python中并没有定义argc,要获得参数的个数,需要使用len(sys.argv)当用户使用'pythonc"command
Stella981 Stella981
2年前
Airflow笔记
1\.依赖MySqlOperator的数据库交互通过MySQLdb模块来实现,使用前需要安装相关依赖:pipinstallapacheairflowmysql2\.使用使用MySqlOperator执行sql任务的一个简单例子:fromairflowimp
Stella981 Stella981
2年前
Redis安装及前后置启动
Redis简单介绍及在Linux上安装(这里测试用是版本:redis3.0.0.tar.gz)一:什么是Redis?redis就是C语言编写的一个高性能的键值存储(keyvalue)的非关系型数据库(NoSql)。二:非关系型数据库的优点与缺点优点:可以轻松地处理海量数据缺点:1.没有主外键,
Stella981 Stella981
2年前
Python调用C语言函数
在C调用Python模块时需要初始化Python解释器,导入模块等但Python调用C模块却比较简单,ctypes模块提供了和C语言兼容的数据类型和函数来加载dll或so文件,因此在调用时不需对源文件做任何的修改1.编写C语言代码,可参考https://www.cnblogs.com/zhouzhishuai/p/9529487.html(ht