DDT数据驱动

总结·

数据结构:列表、数据字典、json串、元组

文件:操作思路、txt文件、csv文件、excel文件

数据库:数据库连接、数据提取、关闭数据库

pytest参数化:@[email protected],conftest

一、列表

#  列表定义
listA=['jintian','mingtian','houtian']

# 列表逐个读取(第一种读取方式)
for i in  listA:
    print("a列表里面的每个元素",i)

# 第二种读取方式
for i in range(0,len(listA)):
    print("b列表里的每一个元素",list[i])

# 在列表里面添加某个元素
# append方法
listA.append('dahoutian')

二、字典

数据字典的定义
userinfo={'name':'zhangsan','mima':'123456'}
# 关键字读取
for key in userinfo.keys():
    print("字典key",key)
# value读取
for value in userinfo.values():
    print("字典value",value)
# 全部内容读取
for key in userinfo:
    print(key,userinfo[key])
# 数据字典添加,直接赋值
userinfo["email"]='[email protected]'

三、json数据

# json文件操作
import json
# 读取json文件
jsonfile=open('collection.json','r',encoding='utf-8')
print(jsonfile)
# 转换数据类型
jsondict=json.load(jsonfile)
# 提取json文件中的内容
# print(jsondict['item'])
for data in jsondict['item']:
    # item1下有多个字典内容,你要取哪个序列的内容要写上去,要不然会报错
    # print(data['item1'][0]['request']['body']['formdata'])
    for d in data ['item1'][0]['request']['body']['formdata']:
        # print(d)
        for key in d:
            print(key,d[key])

四、txt文本文件数据驱动

脚本一.

# txt文件读取
# 打开文件
file1=open("../DDT_test/author.txt",'r',encoding='utf-8')
# 读取文件
rows=file1.read()
print(rows)
# 把取出来的文件用逗号分割,第一个和最后一个的中括号去掉
result=rows[1:-1].split(',')
print(result)
# 取值文件
for data in result:
    print(data[1:-1])
# 选择若干权限,调用提交用户,选中需要的权限
# 导入包文件
encoding='utf-8'
import pytest
from selenium import webdriver
from selenium.webdriver.support.select import Select
import random
# g_number=6
import time

class Test_select_autho_addgroup():
    # 登录初始化:只做一次
    def login(self):
        self.url = "http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        self.driver = webdriver.Chrome()
        self.driver.get(self.url)
        self.driver.find_element_by_name('username').send_keys('atstudy')
        self.driver.find_element_by_name('password').send_keys('51testing')
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
    # 选择某些权限
    # @pytest.fixture()
    # def test_select_autho(self):
    #     autholist=[]
    #     url='http://testplt.share.atstudy.com/admin/auth/permission/'
    #     self.driver.get(url)
    #     # for i in range(1,89):
    #     #     if i==number:
    #     for j in range(0,g_number):
    #         # 生成随机数
    #         i=random.randint(1,88)
    #         print(i)
    #         autho=self.driver.find_element_by_xpath('//*[@id="result_list"]/tbody/tr['+str(i)+']/th/a').text
    #         autholist.append(autho)
    #     print(autholist)
    #     return autholist
    # 添加组
    def test_add_group(self):
        url = 'http://testplt.share.atstudy.com/admin/auth/group/add/'
        self.driver.get(url)
        self.driver.find_element_by_id('id_name').send_keys("group1")
        # 选中权限添加
        # 从文件中获取权限
        # 打开txt文件
        f1=open("../DDT_test/author.txt","r",encoding='utf-8')
        # 读取txt文件
        con=f1.read()
        # print(con)
        result=con[1:-1].split(', ')
        print(result)
        for autho in result:
            print(autho)
            # time.sleep(5)
            select_auto=self.driver.find_element_by_id('id_permissions_from')
            Select(select_auto).select_by_visible_text(autho[1:-1])
        # Select(autho).select_by_visible_text('auth | 权限 | Can add permission')
        self.driver.find_element_by_xpath('//*[@id="id_permissions_add_link"]').click()

if __name__ == '__main__':
    obj=Test_select_autho_addgroup()
    obj.login()
    obj.test_add_group()

被读取的文件

DDT数据驱动_第1张图片

五、DDT与parametrize结合

脚本

语法脚本

# DDT与paramterize的结合
# 语法
import pytest

# 传参
def test_fangfa1():
    a=[1,2,3]
    print(a)
    return a
class Test_shi1():
    # parametrize要传的参数,应该是容器的项目,项目里面包含一堆值
    @pytest.mark.parametrize('ao',test_fangfa1())
    def test_fangfa2(self,ao):
        b=ao
        print(b)

if __name__ == '__main__':
    pytest.main(['-s',"test_1.py",'-v'])

​​​​​​​


# 通过txt文件选择若干权限,添加组
# 导入包文件
import pytest
from selenium import webdriver
from selenium.webdriver.support.select import Select

# 把一个公用数据引用过来
from DDT_test.file_test import get_autho


class Test_select_autho_addgroup():
    # 登录初始化:只做一次
    def setup_class(self):
        self.url = "http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        self.driver = webdriver.Chrome()
        self.driver.get(self.url)
        self.driver.find_element_by_name('username').send_keys('atstudy')
        self.driver.find_element_by_name('password').send_keys('51testing')
        self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
        # 原本在添加方法里面的url,放到初始化里面,因为每次运行都是要执行的
        url = 'http://testplt.share.atstudy.com/admin/auth/group/add/'
        self.driver.get(url)
        self.driver.find_element_by_id('id_name').send_keys("group1")


    # 添加组
    @pytest.mark.parametrize('autho',get_autho())
    def test_add_group(self,autho):
        # 选中权限添加
        print("第二个方法下",autho)
        select_auth=self.driver.find_element_by_id('id_permissions_from')
        Select(select_auth).select_by_visible_text(autho)
        self.driver.find_element_by_xpath('//*[@id="id_permissions_add_link"]').click()

if __name__ == '__main__':
    # obj=Test_select_autho_addgroup()
    # obj.login()
    # obj.test_add_group()
    # get_autho
    pytest.main(['-s','test_add_group.py','-v'])

六、conftest与DDT结合

在根目录下新建conftest.py文件

所有同目录文件运行前,都会先去执行conftext文件

scope下的session,指的是,命令行运行所对应的范围

scope下的moudle是指对所有模块

scope下的class是对类有效

scope下的function是指对方法有效

@pytest.fixture(scope='function')

import pytest

@pytest.fixture(scope='session')
# 获取权限列表方法
def get_autho():
    # 打开文件
    #   权限列表
    autholist=[]
    file1=open("../DDT_test/author.txt",'r',encoding='utf-8')
    # 读取文件
    rows=file1.read()
    # print(rows)
    # 把取出来的文件用逗号分割,第一个和最后一个的中括号去掉
    result=rows[1:-1].split(',')
    print(result)
    # 取值文件
    for autho in result:
        autholist.append(autho[1:-1])
    print("autholist列表里面值",autholist)
    return autholist

七、DDT-CSV

# 获取用户信息
import csv
def get_userdata():
    # 登录数据列表
    datalist=[]
    # 打开文件,以只读方式
    file1=open("testcase.csv","r")
    # 读文件
    rows=csv.reader(file1)
    # 跳过首行
    rows.__next__()
    # 逐行读取文件
    for row in rows:
    # 因为第三行是入参,所以要转换成字典类型
        rowdict=eval(row[2])
        datalist.append(rowdict)
    print(datalist)
    # 把字典数据内容返回给下一个方法
    return datalist

# 写入
import csv
def write_csv():
    # 打开文件,以只读方式
    file1=open("../DDT_test/testcase.csv","r")
    # 读文件
    rows=csv.reader(file1)
    # 跳过首行
    rows.__next__()
    # 以写入的方式打开报告文件
    file2=open("testreport.csv","w",newline="")
    writes=csv.writer(file2)
    # 将测试内容和实际运行结果写入测试报告文件
    for row in rows:
        row.append("实际运行结果")
        writes.writerow(row)
        # 关闭文件
        file1.close()
        file2.close()
# Django自动化测试平台selenium自动化测试脚本-pytest封装
# 功能名称:登录
# 版本:v2.1_参数化设置_相同处理过程,不同参数
# 描述:常量正常异常用户登录
import pytest
from selenium import webdriver

# 1、创建测试类
# from DDT_test.database_test import get_db_data
from DDT_test.file_test import get_userdata


class Test_Django_Login():
    # 2、创建测试方法
    #   正常登录测试方法:用户名不存在
    #   登录初始化
    def setup_method(self):
        self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        self.driver=webdriver.Chrome()
        self.driver.get(self.url)
    # 正常登录测试方法
    @pytest.mark.parametrize('userinfo',get_userdata())
    def test_login_01(self,userinfo):
        # print(userinfo[0])
        # print(userinfo[1])
        # dd=eval(userinfo)
        # print(dd['username'])
        # print(dd['password'])
        print("用户名",userinfo['username'])
        print("密码",userinfo['password'])
        print("运行状态",userinfo['state'])

        self.driver.find_element_by_name('username').send_keys(userinfo['username'])
        # self.driver.find_element_by_name('password').send_keys(pwd)
        # self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
        # # 统一检查点
        # result=self.driver.current_url
        # if state==1:
        #     assert result!=self.url
        # else:
        #     assert result==self.url
if __name__ == '__main__':
    pytest.main(['test_login.py','-s','-v'])

八、DDT-Excel-Pandas

数据库这种比较适合做参数化

# excel文件操作
def get_userdata():
    import pandas as pd
    # 打开文件,读文件
    df=pd.read_excel('../DDT_test/testcase.xlsx')
    # 取得行数是从第二行开始取得,如果是0的话
    # row=df.loc[0].values
    # print("打印出每行的内容",row)
    cloum=df['输入参数'].values
    print(type(cloum))
    # 转换成列表类型内容
    listdata=cloum.tolist()
    print("转换成列表后的类型",type(listdata),listdata)
    return listdata
# Django自动化测试平台selenium自动化测试脚本-pytest封装
# 功能名称:登录
# 版本:v2.1_参数化设置_相同处理过程,不同参数
# 描述:常量正常异常用户登录
import pytest
from selenium import webdriver

# 1、创建测试类
from DDT_test.file_test import get_userdata


class Test_Django_Login():
    # 2、创建测试方法
    def setup_method(self):
        self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
        self.driver=webdriver.Chrome()
        self.driver.get(self.url)
    # 正常登录测试方法
    @pytest.mark.parametrize('userinfo',get_userdata())
    def test_login_01(self,userinfo):
        print(type(userinfo))
        dd=eval(userinfo)
        print("用户名",dd['username'])
        print("密码",dd['password'])
        # print("用户名",userinfo['username'])
        # print("密码",userinfo['password'])
        # print("运行状态",userinfo['state'])

        self.driver.find_element_by_name('username').send_keys(dd['username'])
        # self.driver.find_element_by_name('password').send_keys(pwd)
        # self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
        # # 统一检查点
        # result=self.driver.current_url
        # if state==1:
        #     assert result!=self.url
        # else:
        #     assert result==self.url
if __name__ == '__main__':
    pytest.main(['test_login_01.py','-s','-v'])

九、DB技术-DDT

# Django自动化测试平台selenium自动化测试脚本-pytest封装
# 功能名称:登录
# 版本:v2.1_参数化设置_相同处理过程,不同参数
# 描述:常量正常异常用户登录
import pytest
from selenium import webdriver

# 1、创建测试类
from DDT_test.database_test import get_db_data


class Test_Django_Login():
    # 2、创建测试方法
    # def setup_method(self):
    #     self.url="http://testplt.share.atstudy.com/admin/login/?next=/admin/"
    #     self.driver=webdriver.Chrome()
    #     self.driver.get(self.url)
    # 正常登录测试方法
    @pytest.mark.parametrize('userinfo', get_db_data())
    def test_login_01(self,userinfo):
        print(type(userinfo))
        aa=userinfo[0]
        print(aa)
        # dd=eval(userinfo)
        # print("用户名",dd['username'])
        # print("密码",dd['password'])
        # print("用户名",userinfo['username'])
        # print("密码",userinfo['password'])
        # print("运行状态",userinfo['state'])

        # self.driver.find_element_by_name('username').send_keys(dd['username'])
        # self.driver.find_element_by_name('password').send_keys(pwd)
        # self.driver.find_element_by_xpath('//*[@id="login-form"]/div[3]/input').click()
        # # 统一检查点
        # result=self.driver.current_url
        # if state==1:
        #     assert result!=self.url
        # else:
        #     assert result==self.url
if __name__ == '__main__':
    pytest.main(['test_login_02.py','-s','-v'])

# 通过python脚本获取mysql数据库的数据集合
# 知道数据库的访问用户和用户名
def get_db_data():
    # 导入类库
    import pymysql
    # 连接数据
    db=pymysql.connect(host='127.0.0.1',db='jwmall',user='root',password='123456',charset='utf8')
    # 设置游标,访问数据库,
    cursor=db.cursor()
    # 通过游标,总执行数据库的一些命令
    cursor.execute('select username,password from mmall_user')
    # 数据取一个看下,都是固定方法
    # 把所有数据取出来看下,是一个元祖的方式
    data=cursor.fetchall()
    print(data)
    # 关闭数据库
    db.close()
    return data

if __name__ == '__main__':
    get_db_data()

问题: 是test文件时怎么写入、,跟csc的方式是一样的吗?

你可能感兴趣的:(python,开发语言)