5-实际测试-TestMain

本文介绍了webtest工作的第五步——实际测试。通过创建管道和子进程,实现测试逻辑。子进程负责Http transaction,父进程读取并计算测试结果。在未超时的情况下,循环执行Tcp连接、请求、响应(如果未强制)和关闭连接。当timer超时,系统会发送SIGALRM信号中断系统调用,此时需要处理信号。TestMain的完整源码在文中提供。
摘要由CSDN通过智能技术生成

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1

Welcome to my github: https://github.com/gaoxiangnumber1

  • webtest工作的第五步是根据用户输入参数进行实际测试,对应函数void TestMain();。整体逻辑分为4步。
    1. 创建管道。对于所有的库函数call error,使用perror函数打印出此时errno值对应的字符串,然后终止程序。
    2. 创建子进程。对于子进程pid == 0:在循环体内立刻执行break;,避免子进程再创建子进程。
    3. 对于父进程:
      (1). 从管道中读取子进程写的测试数据。注意将读取stream设为unbuffered。
      (2). 计算总测试结果,并打印输出,webtest成功结束。
    4. 对于子进程:
      (1). 设置alarm_handler,并开始计时alarm(test_time);。当test_time expired时,handler将全局变量timer_expired设为1,代表测试时间已完成,不能继续测试。
      (2). 进行实际的Http transaction,转交给函数void HttpTransaction(const char *host, const int port, const char *request)
      (3). 测试完毕,将测试得到的数据写给父进程,终止子进程。
  • HttpTransaction(const char *host, const int port, const char *request)逻辑:在未超时的前提下(timer_expired == 0),执行死循环,共4步。
    1. 通过TcpConnect函数创建与server的Tcp连接。
    2. 写入(write)已经写好的request。
    3. 如果用户没有设置force选项,读取server的reply。
    4. 关闭socket,返回第一步。
void HttpTransaction(const char *host, const int port, const char *request)
{
    int req_len = strlen(request), socket, read_bytes;
    char buf[MAX_BUF_SIZE];

    for(int read_error = 0;;)
    {
        if(timer_expired) // If have received alarm signal.
        {
            // When timer expired, os will send SIGALRM signal that will interrupt(errno = EINTR)
            // slow system calls(connect, write, read and so on, see APUE.), that is, every time the
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值