单元测试02

本篇博客

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 框架内容

框架内容:数据驱动框架

  1. 公共模块(Commonlib)
  2. 数据模块(DataXml)
  3. 被测函数模块(funcdemo)
  4. 测试用例模块(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
原文地址:https://www.cnblogs.com/zhangyangcheng/p/12534197.html