# 使用“数据驱动测试”之前应该知道的




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

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

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

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

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

这里以csv文件为例，大多文章也是选用的csv/excel文件。
![](http://img.testclass.net/tc_tes_driver_1.png)
参数、断言、结果都有了，大概就这样子吧？

接下来需要将数据读取出来。
```python
# 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你好', '']]
```

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

那么接下来要用这些数据做自动化测试了？被测试功能如下：
![](http://img.testclass.net/tc_tes_driver_2.png)

测试代码如下：

```python
# 测试登陆功能
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文件中。

```python
# 读取本地 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文件，结果如下：

![](http://img.testclass.net/tc_tes_driver_3.png)

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

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

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

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

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

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

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

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

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

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

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



原始封面

![课程图片](https://images.unsplash.com/photo-1509565840034-3c385bbe6451?w=300)


