自动化测试过程中常规策略

一.背景

Session称为会话,是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间,如果需要的话,可能还有一定的操作空间。通常情况下Session用于存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览 Web应用程序时需要的其它信息。

PHP的 $_SESSION 的功能之所以如此强大是因为有WebServer的支持,试想一下如果在命令行下读取一个 $_SESSION 变量,会是什么结果?

必然是null,因为PHP的session_start()函数在命令行下是无法使用的,假若一段逻辑结果中含有这个Session会话变量,该如何去测试它的有效性?

实现读取缓存在数据访问层中抽离策略

一. 背景

使用数据缓存在WEB工程中是一个非常有意义的策略,不仅仅可以减少数据库负载,而且当数据缓存在内存中,能大大提高了的读取速度。

在WEB设计中,我们往往忽略一个重要的信息 – Key,每当我们需要缓存的时候,只是单纯的对一个Key进行SET或者GET操作,时间长了,也许就出现了以下的问题:

  • 这个数据缓存的Key是什么;
  • 这个数据缓存生命周期有多长;
  • 如何不获取这个数据缓存,而得到实际的数据做测试;
  • 在其他项目中同时可能用到这个数据缓存,如何重置这个缓存
  • ……

这就造成了我们平时常见的一种场景,一位同事查到原因,高喊:

“Shit!为什么生产环境上的数据总是测试有问题,测试环境都好好的,线上一定是有缓存,但是我们怎么把它清除掉!

在Yaf应用中,创建一个模型层UserModel:

Class UserModel {
    // 初始化连接数据库,pre_common_member只有三条数据ID:1,2,3
    public function __construct() {
        $this->_db = Core_LinkMySQL::get('hiapk_x2');
    }

    // 通过uid获取用户名,数据不存在时返回FALSE
    public function fetchUsernameById($id) {
        return $this->_db->select('username')
            ->from('pre_common_member')
            ->where('uid', $id)
            ->fetchValue();
    }

    // 通过uid获取用户行数据,数据不存在时返回FALSE
    public function fetchRowById($id) {
        return $this->_db->select('username', 'groupid', 'adminid', 'regdate')
            ->from('pre_common_member')
            ->where('uid', $id)
            ->fetchOne();
    }
}

在Yaf应用中,创建一个控制层UserController:

Class UserController extends Yaf_Controller_Abstract {
    // init方法相当于控制器的初始化函数,取消自动渲染视图
    public function init() {
        Yaf_dispatcher::getInstance()->disableView();
    }
    // 输出需要的JSON信息
    private function __responseJson($code=0, $data=FALSE) {
        $response = json_encode(array('code'=>$code, 'data'=>$data));
        $this->getResponse()->setBody($response);
    }
    // JSON Action
    public function jsonAction($uid=0) {
        if ( $uid < 1 ) return $this->__responseJson(-1);

        $user_model = new UserModel();
        $row = $user_model->fetchRowById($uid);
        return $this->__responseJson(0, $row);
    }
}

标签表

CREATE TABLE `t_tags` (
    `t_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '标签ID',
    `t_name` varchar(200) NOT NULL DEFAULT '' COMMENT '标签名称',
    `t_cname` varchar(200) NOT NULL DEFAULT '' COMMENT '标签别名',
    `t_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '含有标签的对象集合数目',
    PRIMARY KEY (`t_id`),
    UNIQUE KEY `cname` (`t_cname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

关联表(多对多的映射)

CREATE TABLE `t_tag_relationships` (
    `tr_objectid` int(11) NOT NULL DEFAULT '0' COMMENT '含有tag的对象ID,如文章,视频,图片对应ID',
    `t_id` int(11) NOT NULL COMMENT '标签ID',
    PRIMARY KEY (`tr_objectid`,`t_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

查询指定文章下的tags信息

SELECT t_id, t_name, t_cname FROM t_tags WHERE t_id IN( 
    SELECT t_id FROM t_tag_relationships WHERE tr_objectid=1006
);

查询指定文章相关tag信息的文章

SELECT tr_objectid FROM t_tag_relationships WHERE t_id IN( 
    SELECT t_id FROM t_tag_relationships WHERE tr_objectid=1006
) AND tr_objectid != 1006;