unittest03--断言

断言

断言的含义

    断言用于判断测试结果的正确性,即比对预期结果与实际结果是否相等或匹配
    unittest提供断言方法进行断言
    断言语句要写在测试用例中
    断言通过时,测试结果中默认显示.
    断言失败时,测试结果中默认显示F(Failure),并抛出异常
    出现断言失败时,测试代码不会停止而是继续执行

断言的分类

断言值是否相等
    assertEqual(e, a)
        断言e等于a
        适用于任意类型数据的比较
        字典的键和值均区分大小写
    assertNotEqual(e, a)
        断言e不等于a
断言是否包含
    assertIn(e, a)
        断言e在a中
        适用于字符串、列表、字典(键)等
    assertNotIn(e, a)
        断言e不在a中
断言是否为空
    assertIsNone(e)
        断言e为空
    assertIsNotNone(e)
        断言e非空
断言真假
    assertTrue(e)
        断言e等于True
    assertFalse(e)
        断言e等于False
断言大小
    assertGreater(e, a)
        断言e>a
    assertLess(e, a)
        断言e<a
    assertGreaterEqual(e, a)
        断言e≥a
    assertLessEqual(e, a)
        断言e≤a
断言类型
    assertIsInstance(e, dict)
        断言e为字典
        第2个参数是数据类型关键字,如str、list、dict、tuple等
    assertNotIsInstance(e, list)
        断言e不是列表

断言展示

"""
    断言
"""
import unittest # 导入unittest模块 免安装
class Democeshi(unittest.TestCase):# 类名自定义,无需带test单词,括号中写法固定
    def test1(self):
        self.assertEqual(3,3)# 若3=3则测试通过
    def test5(self):
        self.assertEqual(3, 4)  # 若3=4则测试通过,否则测试失败,抛出异常
    def testshow(self):
        self.assertIn(3,[1,2,3,4,5])# 若3在后面的列表中,则测试通过,否则测试失败
class Demo2(unittest.TestCase):
    def test3(self):#测试用例
        self.assertIsInstance('hello',str)# 测试hello是不是字符串
    def test4(self):
        self.assertIsInstance({'name':'张三'}, dict)  # 测试第一个参数是不是字典
if __name__=='__main__':
    unittest.main()

调试project_M1代码

将check_db进行调试,加入断言

from project_M1.common import entry, log
import configparser, os, pymysql

class DB:
    def __init__(self):
        """
        读取db.conf文件,获得数据库服务器的信息
        返回内容是 数据库服务器信息
        """
        try:  # 异常处理
            # 获得测试要用的数据库服务器的节点名
            which_db = entry.Entry().get_which_db()
            conf = configparser.ConfigParser()
            conf.read('../conf/db.conf', encoding='utf-8')
            host = conf.get(which_db, 'host')
            port = conf.get(which_db, 'port')
            user = conf.get(which_db, 'user')
            password = conf.get(which_db, 'password')
            db = conf.get(which_db, 'db')
            self.dbinfo = {'host': host, 'port': int(port), "user": user, 'password': password, 'db': db}
            log.log().info('数据库信息==' + str(self.dbinfo))
        except Exception as e:
            log.log().error('数据库配置文件[db.conf]读取出错' + e)

    def conn_db(self):  # 连接数据库的函数
        try:
            # conn = pymysql.connect(host='192.168.175.128',port=3306,user='root',password='123456',db='exam')
            conn = pymysql.connect(**self.dbinfo)  # 连接数据库
            log.log().info('连接数据库成功')
            return conn
        except Exception as e:
            log.log().error('数据库连接出错' + e)

    def get_sqlfiles(sqlf, sqlfiles=[]):  # sqlfiles默认参数,要给参数只能给列表,要么不给
        try:
            if len(sqlfiles) == 0:  # 表示没有给实参,则读取所有sql文件
                sqlfiles = [file for file in os.listdir('../initsqls/') if
                            file.endswith('.sql')]  # 所有.sql文件名存入sqlfiles列表
            sqlfiles = ['../initsqls/' + i for i in sqlfiles]
            log.log().info('获得sql文件名' + str(sqlfiles) + '列表成功')
            return sqlfiles
        except Exception as e:
            log.log().error('获得sql文件名列表失败')
    # 读取带.sql文件扩展名文件中的sql语句
    def read_sqls(self, sqlfiles=[]):
        sqlfiles = self.get_sqlfiles(sqlfiles)  # 获得带路径的文件名列表
        sqls = []  # 存sql语句的列表
        try:
            for sqlfile in sqlfiles:  # sqlfile表示每一个sql语句文件
                sfile = open(sqlfile, 'r', encoding='utf-8')  # 打开文件
                for sql in sfile:  # sql是从sfile文件中获得每一行
                    # 如果这行字符长度大于0 并且 不是以--开头的
                    if len(sql.strip()) > 0 and not sql.startswith('--'):
                        sqls.append(sql.strip())  # sql语句中的回车不存入列表
            log.log().info('读取初始化sql语句成功==' + str(sqlfiles))
            return sqls
        except Exception as e:
            log.log().error('读取初始化sql语句出错' + e)

    def init_db(self, sqlfiles=[]):  # #执行sqlfiles文件中的sql语句,初始化数据库
        """
        目的:数据初始化
        :param sqlfiles: 指定sql文件
        :return:
        """
        sqls = self.read_sqls(sqlfiles)  # 读取所有需要执行的sql命令
        conn = self.conn_db()  # 连接数据库
        cursor = conn.cursor()  # 创建游标
        try:
            for sql in sqls:
                cursor.execute(sql)  # 只能一条一条的执行,结果暂存到cursor中
            conn.commit()  # 提交数据到数据库
            conn.close()
            log.log().info('初始化数据库成功')
        except Exception as e:
            log.log().error('初始化数据库出错')

    def check_db(self, case_name, expectsql, argument, expect_db_rows):
        """
        :param case_name: 用例名称
        :param expectsql: 预期sql语句
        :param argument: 接口参数
        :param expect_db_rows: 预期行数
        :return:
        """
        conn = self.conn_db()  # 连接数据库
        try:
            cursor = conn.cursor()  # 创建游标
            cursor.execute(expectsql)  # 执行sql语句
            dbactual = cursor.fetchone()[0]  # 取第一行第一列数据
            if dbactual == expect_db_rows:
                log.log().info(case_name + '==落库检查==通过')
                return True
            else:
                log.log().warning(case_name + '==落库检查==失败==预期行数:' + str(expect_db_rows) + ',实际行数:' + str(dbactual))
                return False
        except Exception as e:
            log.log().error('落库检查出错' + e)

if __name__=='__main__':
    DB().init_db()
    DB().check_db('测试','select count(*) from user',{'name':123},3)

调试project_M1

将postdata进行调试,加入断言

import requests
from project_M1.common import log


def post(address, argument, case_name, expect):
    """
    :param address: 接口地址
    :param argument: 请求参数
    :param case_name: 用例名称
    :param expect: 预期结果
    :return:
    """
    try:
        # 发送请求 判断响应结果的正确性
        res = requests.post(url=address, data=argument)
        if 'text/html' in res.headers['Content-Type']:  # 表示响应内容的类型是字符串
            actual = res.text
            # 结果比对
            if expect in actual:
                log.log().info('比对登录接口返回==' + case_name + '==通过')
                return True
            else:
                log.log().warning('比对登录接口返回==' + case_name + '==失败==预期结果:' + expect + ',实际结果:' + actual)
                return False
        elif 'application/json' in res.headers['Content-Type']:
            actual = res.json()  # 实际结果(字典)
            # 比对接口返回结果
            if expect == actual:
                log.log().info("比对注册接口返回==" + case_name + '==通过')
                return True
            else:
                log.log().warning('比对注册接口返回==' + case_name + '==失败==预期结果:' + str(expect) + ',实际结果:' + str(actual))
                return False
        else:  # xml
            pass  # 暂时不写代码
    except Exception as e:
        log.log().error('发送数据,比对响应结果出错')


if __name__ == '__main__':
    post('http://192.168.139.137/exam/login/', {'username': 'admin', 'password': '123456'}, '成功登录测试', '登录成功')
posted @ 2021-11-07 18:49  暄总-tester  阅读(168)  评论(0)    收藏  举报