zoukankan      html  css  js  c++  java
  • 单元测试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
  • 相关阅读:
    hdoj:2075
    hdoj:2072
    hdoj:2071
    hdoj:2070
    hdoj:2069
    test001
    hdoj:2067
    hdoj:2061
    hdoj:2058
    hdoj:2057
  • 原文地址:https://www.cnblogs.com/zhangyangcheng/p/12534197.html
Copyright © 2011-2022 走看看