zoukankan      html  css  js  c++  java
  • 使用“数据驱动测试”之前应该知道的

    我曾经写过一篇博客《自动化测试---被玩坏的数据驱动》讨论过数据驱动测试,当时主要是吐槽那些教大家读取txt、csv/excel、xml文件文章。“我教大家如何做数据驱动测试,来!我们先学习如何读取excel文件。。。”,然后,网上也有大量的文章来介绍如何用excel来管理测试数据的,甚至是测试报告展示的。

    读各种数据文件就是驱动测试?这样真的方便做测试么?


    #### 什么是数据驱动测试?

    从它的定义来看,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说的直白些,就是参数化的应用。


    #### “他们”认为数据驱动什么样子?

    这里以csv文件为例,大多文章也是选用的csv/excel文件。

    参数、断言、结果都有了,大概就这样子吧?

    接下来需要将数据读取出来。

    # coding=utf-8
    import csv
    import codecs
    from itertools import islice
    
    # 读取本地 CSV 文件
    data = csv.reader(codecs.open('user_info.csv', 'r', 'utf_8_sig'))
    
    # 用户存放用户数据
    users = []
    
    # 循环输出每一行信息
    for line in islice(data, 1, None):
        users.append(line)
    
    # 打印
    print(users)
    

    得到结果:

    [['', '123', '请输入帐号', ''],
    ['user', '', '请输入密码', ''],
    ['error', 'error', '帐号或密码错误',''],
    ['admin', 'admin123', 'admin你好', ''],
    ['guest', 'guest123', 'guest你好', '']]
    

    这里得到一个测试数据的二维数组。

    那么接下来要用这些数据做自动化测试了?被测试功能如下:

    测试代码如下:

    # 测试登陆功能
    from selenium import webdriver
    from time import sleep
    
    
    driver = webdriver.Chrome()
    
    for user in users:
        driver.get("http://127.0.0.1:8000/")
        driver.find_element_by_id("inputUsername").send_keys(user[0])
        driver.find_element_by_id("inputPassword").send_keys(user[1])
        driver.find_element_by_id("Login").click()
        sleep(2)    
        tips = driver.find_element_by_id("tips").text
        print(tips)
        print(user[2])
        try:
            assert tips == user[2]
        except AssertionError as msg:
            print(msg)
            user[3] = "Faile"
        else:
            user[3] = "Pass"
    
    driver.quit()
    
    # 打印结果
    print(users)
    
    

    运行之后的测试结果:

    [['', '123', '请输入帐号', 'Pass'],
    ['user', '', '请输入密码', 'Pass'],
    ['error', 'error', '帐号或密码错误','Pass'],
    ['admin', 'admin123', 'admin你好', 'Faile'],
    ['guest', 'guest123', 'guest你好', 'Faile']]
    

    看,结果已经写到最后一列了。

    最后,我们还需要将测试结果写回到csv文件中。

    # 读取本地 CSV 文件
    csv_file = csv.writer(codecs.open('user_info.csv', 'w','utf_8_sig'), 
                                      dialect="excel")
    
    # 写入标题
    csv_file.writerow(['用户名','密码','断言','结果'])
    
    # 循环写入数据
    for user in users:
        csv_file.writerow(user)
    
    # 打印
    print(users)
    

    打开CSV文件,结果如下:

    看结果一列,是不是已经有了结果。


    #### 那么,下来思考几个问题。

    1、测试结果是否太过简单了,只有“Pass”和“Faile”,没有任何失败的日志,是否需要另起一列记录失败日志?

    2、如何统计出总失败的用例数和成功的用例数?

    3、如果想单独验证失败的两条用例应该怎么做?例如上图中的最后两条失败的用例。

    4、上面的测试代码中,有多少是真正用在测试操作的,至少一半都在读写csv文件,是否需要做封装,想想怎么封装更简单?

    5、在获取具体读取数据的时候,我们使用的是user[0]、user[1]、user[2],你真的容易分辨这些数据么?如果又加了一列数据呢?不改代码是不是就对不上号了。

    6、这只是一组登录数据。我们知道不同的功能,所需要的数据是不一样的,比如搜索,只需要“搜索关键字”, 例如注册,需要“邮箱”、“密码”、“重复密码”、“昵称”等。我们一个系统有N多功能的好吧!

    7、如第6条,这些测试数据要怎么放,放在一个csv文件还是多个文件?怎么统计测试结果?

    所以,知道读取数据文件有多坑了吧!?谁说的方便维护?你一定没用这种方式写过真正的项目吧!一直处在跟着别人写demo阶段。如果你有更“高大上”的处理方式欢迎请告诉我,谢谢!

    下一篇,我将介绍基于单元测试框架的数据驱动。

  • 相关阅读:
    CF1552 D. Array Differentiation
    CF1542 B. Plus and Multiply
    CF1543 D1. RPD and Rap Sheet (Easy Version)
    CF1555 E. Boring Segments(线段树+双指针)
    CF1513 D. GCD and MST
    hdu 6194 string string string
    CF1527 B2. Palindrome Game (hard version)
    DDD领域驱动设计落地实践(十分钟看完,半小时落地)
    【5分钟】W10 64bit系统本地安装postgresql 11
    程序员如何成为架构师
  • 原文地址:https://www.cnblogs.com/fnng/p/9375172.html
Copyright © 2011-2022 走看看