本篇博客
UT执行
1 借助于单元测试框架:unittest
2 框架内容
3 读取数据的三种方式
4 xml的介绍
5 使用xml文件的方式读取
6 使用csv文件进行读取
7 工作中读取数据方式
补充:csv文件的建立(两种方式)
1 在桌面---新建.txt文件---输入内容(逗号隔开)----修改.csv文件(如果中文不行,可以另保存.txt文件时修改为utf-8格式。)
2 直接在项目中(pycharm)新建.csv文件
UT执行
1 借助于单元测试框架:unittest
案例:小计算器
CCalcDemo.py(被测函数)
# 定义类计算器 class Calc(): #加法函数 def jia(self,a,b): c = a + b return c def jian(self,a,b): c = a -b return c if __name__ == '__main__': # 创建对象 ca = Calc() res1 = ca.jia(3,4) res2 = ca.jian(5,2) print(res1) print(res2)
test01.py(测的用例)
# 导入unittest import unittest from CCalcDemo import Calc # 继承 class Test1(unittest.TestCase): # 初始化函数 def setUp(self): print("开始") # 结结束函数 def tearDown(self): print("结束") def test001(self): #创建对象 ca = Calc() res1 = ca.jia(3,4) # 判断 self.assertEqual(res1,7) def test002(self): # 创建对象 ca = Calc() res2 = ca.jian(10,2) #进行比对 self.assertEqual(res2,9) if __name__ == '__main__': unittest.main()
2 框架内容
框架内容:数据驱动框架
- 公共模块(Commonlib)
- 数据模块(DataXml)
- 被测函数模块(funcdemo)
- 测试用例模块(testcast)
3 读取数据的两种方式
不管是UI测试,接口测试,还是单元测试。所有自动化测试,代码和数据都要分开。
这里介绍两种读取数据的方式:还有其他的txt等
1)使用xml文件的方式读取
2)使用csv文件的方式读取
3)工作中读取数据方式(自己加的)
4 xml的介绍
4.1 什么是XML?:
XML指可扩展标记语言
XML是一种标记语句,很类似HTML
XML标签没有被预定义,需要自行定义标签
4.2 XML和HTML的差异:
1.XML为不同的目的而设计
2.XML被设计为传输和存储数据,其焦点是数据的内容,HTML被设计用来显示数据, 其焦点是数据的外观
3.XML意在传输信息,而HTML意在显示信息
4.3 XML的特点
1.XML可以自定义标签
<note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
上例中的标签没有在任何XML标准中定义过,比如<to><from>这些标签都是有作者自己发明的
2.XML必须包含根元素
XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
<?xml version="1.0" encoding="UTF-8" ?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
如上所示,XML文件的根元素为note,剩下的4行描述的是根的子元素
xml文件的开头必须是:
<?xml version="1.0" encoding="UTF-8" ?>
所有的XML标签都必须有关闭标签,在XML中省略标签是非法的,所有的元素都必须有关闭标签
如下所示:
<p>This is a paragraph</p> <p>This is another paragraph</p>
3.XML标签对大小写敏感
XML 标签对大小写敏感。在 XML 中,标签 <Letter> 与标签 <letter> 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的。</message> <message>这是正确的。</message>
XML必须正确的嵌套:如下所示:由于 <i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭。
<b><i>This text is bold and italic</i></b>
4.XML 的属性值须加引号
与 HTML 类似,XML 也可拥有属性(名称/值的对)。
在 XML 中,XML 的属性值须加引号。请研究下面的两个 XML 文档。第一个是错误的,第二个是正确的:
<note date=08/08/2008> <to>George</to> <from>John</from> </note> <note date="08/08/2008"> <to>George</to> <from>John</from> </note>
在第一个文档中的错误是,note 元素中的 date 属性没有加引号。
5.标签可以自由命名
6.标签成对出现
7.标签可以重名
4.4 XML 中的注释
在 XML 中编写注释的语法与 HTML 的语法很相似:
<!-- This is a comment -->
4.5 什么是 XML 元素?
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
<bookstore> <book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title>Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
在上例中,<bookstore> 和 <book> 都拥有元素内容,因为它们包含了其他元素。<author> 只有文本内容,因为它仅包含文本。
在上例中,只有 <book> 元素拥有属性 (category="CHILDREN")。
4.6 XML 命名规则
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
4.7 XML读取文本(重点)
导包:
from xml.dom import minidom
打开文件
root =minidom.parse(filepath) firstnode =root.getElementsByTagName(onenode)[0] secondnode=firstnodee.getElementsByTagName(twonodee)[0].firstChild.data
5 使用xml文件的方式读取
使用xml文件的方式读取
1.需要再项目下新建模块DataXml--->new--->FIle-->data.xml
2.读取文件内容方式,导包:
from xml.dom import minidom
读取步骤
1.打开xml文件
root = minidom.parse("文件路径/文件名")
2.找节点
firstnode = root.getElementsByTagName(""标签名)[索引]
3.找节点上的值
firstnode.getElementsByTagName(""标签名)[索引].firstChild.data
练习:计算器
funcdemo-CalcDemo.py (被测函数)
# 定义类计算器 class Calc(): #加法函数 def jia(self,a,b): c = a + b return c def jian(self,a,b): c = a -b return c if __name__ == '__main__': # 创建对象 ca = Calc() res1 = ca.jia(3,4) res2 = ca.jian(5,2) print(res1) print(res2)
DataXml-data.xml(xml存放数据)
<?xml version="1.0" encoding="UTF-8" ?> <no> <jia> <num1>5</num1> <num2>10</num2> <expect>15</expect> </jia> <jian> <num1>10</num1> <num2>2</num2> <expect>8</expect> </jian> </no>
Commonlib-ReadXml.py(读取xml 数据)
from xml.dom import minidom # class readXml(): # def read_xml(self): # # 打开文件 # root = minidom.parse("../DataXml/data.xml") # firstnode = root.getElementsByTagName("jia")[0] # secondnode = firstnode.getElementsByTagName("num1")[0].firstChild.data # return secondnode # # # 创建对象 # r = readXml() # print(r.read_xml()) class readXml(): def read_xml(self,filename,onenode,twonode): # 打开文件 root = minidom.parse(filename) firstnode = root.getElementsByTagName(onenode)[0] secondnode = firstnode.getElementsByTagName(twonode)[0].firstChild.data return secondnode # # 创建对象 # r = readXml() # print(r.read_xml("../DataXml/data.xml","jia","num1")) # print(r.read_xml("../DataXml/data.xml","jia","num2"))
testcast-test1.py(测试用例)
# 导入unittest import unittest import sys sys.path.append('..') from funcdemo.CalcDemo import Calc from Commonlib.ReadXml import readXml # # 创建对象 # r = readXml() # a = int(r.read_xml("../DataXml/data.xml","jia","num1")) # b = int(r.read_xml("../DataXml/data.xml","jia","num2")) # ex = int(r.read_xml("../DataXml/data.xml","jia","expect")) # 优化 r = readXml() # 继承 class Test1(unittest.TestCase): # 初始化函数 def setUp(self): print("开始") # 结结束函数 def tearDown(self): print("结束") def test001(self): #创建对象 ca = Calc() res1 = ca.jia(int(r.read_xml("../DataXml/data.xml","jia","num1")),int(r.read_xml("../DataXml/data.xml","jia","num2"))) # 判断 self.assertEqual(res1,int(r.read_xml("../DataXml/data.xml","jia","expect"))) def test002(self): # 创建对象 ca = Calc() res2 = ca.jian(int(r.read_xml("../DataXml/data.xml","jian","num1")),int(r.read_xml("../DataXml/data.xml","jian","num2"))) #进行比对 self.assertEqual(res2,int(r.read_xml("../DataXml/data.xml","jian","expect"))) if __name__ == '__main__': unittest.main()
练习2:三角形判断
funcdemo-三角形判断.py
class Sjx(): # 输入三条边,进行判断,是否等边、等腰、普通三角形,否则提示不能组成三角形,用函数来实现 def sjxpd(self,a,b,c): if a + b > c and a + c > b and b + c > a: if a == b and b == c: # return 1 return '等边三角形' elif a == b or b == c or a == c: # return 2 return '等腰三角形' else: # return 3 return '普通三角形' else: # print("不能组成三角形") return -1 if __name__ == '__main__': pass # s = Sjx() # s.sjxpd(1,2,3)
DataXml-data1.xml
<?xml version="1.0" encoding="UTF-8" ?> <node> <db> <b1>3</b1> <b2>3</b2> <b3>3</b3> <expect>等边三角形</expect> </db> <dy> <b1>4</b1> <b2>4</b2> <b3>5</b3> <expect>等腰三角形</expect> </dy> <pt> <b1>3</b1> <b2>4</b2> <b3>5</b3> <expect>普通三角形</expect> </pt> </node>
Commonlib-ReadXml.py
from xml.dom import minidom # class readXml(): # def read_xml(self): # # 打开文件 # root = minidom.parse("../DataXml/data.xml") # firstnode = root.getElementsByTagName("jia")[0] # secondnode = firstnode.getElementsByTagName("num1")[0].firstChild.data # return secondnode # # # 创建对象 # r = readXml() # print(r.read_xml()) class readXml(): def read_xml(self,filename,onenode,twonode): # 打开文件 root = minidom.parse(filename) firstnode = root.getElementsByTagName(onenode)[0] secondnode = firstnode.getElementsByTagName(twonode)[0].firstChild.data return secondnode # # 创建对象 # r = readXml() # print(r.read_xml("../DataXml/data.xml","jia","num1")) # print(r.read_xml("../DataXml/data.xml","jia","num2"))
testcast-test2.py
import unittest import sys sys.path.append('..') from funcdemo.三角形判断 import Sjx from Commonlib.ReadXml import readXml # 创建对象 r = readXml() class Test(unittest.TestCase): # 初始化函数 def setUp(self): print("开始") # 结结束函数 def tearDown(self): print("结束") def test001(self): s = Sjx() res1 = s.sjxpd(int(r.read_xml("../DataXml/data1.xml","db","b1")),int(r.read_xml("../DataXml/data1.xml","db","b2")),int(r.read_xml("../DataXml/data1.xml","db","b3"))) self.assertEqual(res1,r.read_xml("../DataXml/data1.xml","db","expect")) def test002(self): s = Sjx() res1 = s.sjxpd(int(r.read_xml("../DataXml/data1.xml", "dy", "b1")), int(r.read_xml("../DataXml/data1.xml", "dy", "b2")), int(r.read_xml("../DataXml/data1.xml", "dy", "b3"))) self.assertEqual(res1, r.read_xml("../DataXml/data1.xml", "dy", "expect")) if __name__ == '__main__': unittest.main()
6 使用csv文件进行读取
使用csv文件进行读取
注意:csv文件中数据以逗号隔开
读取操作,导包:
import csv
读取步骤:
1.打开并读取csv文件内容
csv.reader(open("csv文件","r"))
2.循环遍历读取的内容,数据类型为列表
3.返回数据待使用
练习1:两数求和csv
funcdemo-CalcDemo2.py
class Clac(): def jia(self,a,b): return a+b
DataXml-data2.csv
1,2,3 4,5,9
Commonlib-rrrCsv.py
import csv class red(): def read_cs(self): lists =[] csv_cc = csv.reader(open("../DataXml/data2.csv","r")) for csv_con in csv_cc: # print(csv_con) lists.append(csv_con) return lists if __name__ =='__main__': cccc = red() cccc.read_cs()
注意:上面的代码为了通用,可以把路径作为变量传进去。
testcast-test3.py
import unittest import sys sys.path.append('..') from Commonlib.rrrCsv import red from funcdemo.CalcDemo2 import Clac class TestDemo(unittest.TestCase): def test001(self): rrr1 = red() for xxx in rrr1.read_cs(): xy =Clac(); # print(xy) res1 = xy.jia(int(xxx[0]),int(xxx[1])) self.assertEqual(res1,int(xxx[2])) if __name__ == '__main__': unittest.main()
练习2:三角形判断csv
funcdemo-三角形判断.py
class Sjx(): # 输入三条边,进行判断,是否等边、等腰、普通三角形,否则提示不能组成三角形,用函数来实现 def sjxpd(self,a,b,c): if a + b > c and a + c > b and b + c > a: if a == b and b == c: return 1 # return '等边三角形' elif a == b or b == c or a == c: return 2 # return '等腰三角形' else: return 3 # return '普通三角形' else: # print("不能组成三角形") return -1 if __name__ == '__main__': pass # s = Sjx() # s.sjxpd(1,2,3)
DataXml-data5.csv
b1,b2,b3,exp 1,2,3,-1 1,5,2,-1 4,2,1,-1 3,4,5,3 3,3,3,1 3,4,4,2 3,4,3,2 3,3,4,2
Commonlib-Readcsv1.py
#想要读取csv文件的内容需要导包 import csv #创建类 # class readcsv(): # def read_csv(self,): # my_list =[] # csv_context = csv.reader(open('../DataXml/data2.csv','r')) # # print(csv_context) # for csv_con in csv_context: # my_list.append(csv_con) # # print(my_list) # my_lists=my_list[1:] # # return my_lists class readcsv(): def read_csv(self,filename): my_list =[] csv_context = csv.reader(open(filename,'r')) # print(csv_context) for csv_con in csv_context: my_list.append(csv_con) # print(my_list) my_lists=my_list[1:] return my_lists # # 创建对象 # cs = readcsv() # aaa = cs.read_csv("../DataXml/data5.csv") # print(aaa)
testcast-sjxtest.py
import unittest import sys sys.path.append('..') from Commonlib.Readcsv1 import readcsv from funcdemo.三角形判断 import Sjx r2 =readcsv() class sjxpd(unittest.TestCase): def setUp(self): print("开始") def tearDown(self): print("结束") def test001(self): my_list = r2.read_csv("../DataXml/data5.csv") for m_li in my_list: sj =Sjx() act = sj.sjxpd(int(m_li[0]),int(m_li[1]),int(m_li[2])) self.assertEqual(act,int(m_li[3])) if __name__ == '__main__': unittest.main()
testcast-testsuitedemo.py(测试套件,可以要也可以不要)
import unittest import sys sys.path.append('..') from testcast.sjxtest import sjxpd from Commonlib.HTMLTestRunner import HTMLTestRunner class SuiteTest(unittest.TestCase): def test_suite(self): # 创建列表 case_list = ['test001'] # 创建测试套件 mysuit = unittest.TestSuite() # 使用循环将测试用例放入到测试套件中 for case in case_list: mysuit.addTest(sjxpd(case)) # # 运行测试套件中的每一个测试用例,并为每一个测试用例生成测试报告 # unittest.TextTestRunner(verbosity=2).run(mysuit) # 生成html格式的测试报告 with open('../report.html','wb') as f: HTMLTestRunner( stream=f, title='计算器单元测试', description="黑马测试一期", verbosity=2 # 为每个测试用例生成测试报告 ).run(mysuit) if __name__ == '__main__': unittest.main()
生成report.html
7 工作中读取数据的方式
练习:
ceshi.py
import configparser class ReadConfig: def __init__(self): self.cf = configparser.ConfigParser() self.cf.read("config.ini") def get_email(self, name): value = self.cf.get("DATABASE", name) return value if __name__ == '__main__': res = ReadConfig() # print(res.get_email('host')) print(res.get_email('age'))
config.ini
[EMAIL] mail_host = smtp.163.com [HTTP] scheme = http [HEADERS] siteuid = all [DATABASE] host = localhost age = 22 [CON] jk = uiui