UnitTest框架简介

UnitTest框架:管理多个用例

断言:进行判断

参数:传参

测试报告生成

UnitTest框架定义

UnitTest框架的作用:管理和运行多个用例

UnitTest的核心要素

相同的代码写在Fixture里面

TestCase(测试用例)

import unittest

class TestDemo(unittest.TestCase):
    def test_method1(self): #以test开头!!!
        print('测试方法1')

    def test_method2(self):
        print('测试方法2')

一些问题总结

如果文件名字有中文 或者不规范 一般会有这个页面提示

删除已有的运行方式:

TestSuite & TestRunner

import unittest

from d94 import TestDemo
from d95 import TestDemo1
from d96 import TestDemo2
# 实例化对象
suite = unittest.TestSuite()

# method 1
# 添加用例方法
suite.addTest(TestDemo('test_method1'))
suite.addTest(TestDemo('test_method2'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))

# 实例化运行对象
runner = unittest.TextTestRunner()
#运行
runner.run(suite)

makeSuite

import unittest

from d94 import TestDemo
from d95 import TestDemo1
from d96 import TestDemo2

suite = unittest.TestSuite()

# 可以导入类中的所有方法
suite.addTest(unittest.makeSuite(TestDemo))
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))

runner = unittest.TextTestRunner()
runner.run(suite)

import unittest
from d99 import add
class TestAdd(unittest.TestCase):
    def test_method(self):
        # 1 2 3
        if add(1,2) == 3:
            print('测试通过')
        else:
            print('测试不通过')

    def test_method2(self):
        # 10 20 30
        if add(10,20) == 20:
            print('测试通过')
        else:
            print('测试不通过')

符合预期:它本身就是要显示不通过的 显示不通过了 就是符合预期

模块和包概念

import unittest

class TestDome1(unittest.TestCase):
    def test_method1(self):
        print('测试1-1')
    def test_method2(self):
        print('测试1-2')

import unittest

class TestDemo2(unittest.TestCase):
    def test_method1(self):
        print('测试2-1')
    def test_method2(self):
        print('测试2-2')
import unittest

from d106 import TestDome1
from d107 import TestDemo2

suite = unittest.TestSuite()

suite.addTest(TestDome1('test_method1'))
suite.addTest(TestDome1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))

runner = unittest.TextTestRunner()
runner.run(suite)
import unittest

from d106 import TestDome1
from d107 import TestDemo2

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestDome1))
suite.addTest(unittest.makeSuite(TestDemo2))

runner = unittest.TextTestRunner()
runner.run(suite)

练习:

def login(username,password):
    if username == 'admin' and password == '123456':
        return "登录成功"
    else:
        return "登录失败"
import unittest
import d110
class TestLogin(unittest.TestCase):
    def test_method1(self):
        username = 'admin'
        password = '123456'
        if d110.login(username,password) == '登录成功':
            print("pass")
        else:
            print('fall')
    def test_method2(self):
        username = 'root'
        password = '123456'
        if d110.login(username,password) == '登录失败':
            print("pass")
        else:
            print('fall')
    def test_method3(self):
        username = 'admin'
        password = '123123'
        if d110.login(username,password) == '登录失败':
            print("pass")
        else:
            print('fall')
    def test_method4(self):
        username = 'aaa'
        password = '123123'
        if d110.login(username,password) == '登录失败':
            print("pass")
        else:
            print('fall')

TestLoader

"""TestLoader"""

import unittest
# 1.用例所在所在路径 2.用例的代码文件名
suite = unittest.TestLoader().discover('./case','ww*.py')

# runner = unittest.TextTestRunner()
# runner.run(suite)
unittest.TextTestRunner().run(suite)
"""TestLoader"""

import unittest
# 1.用例所在所在路径 2.用例的代码文件名
suite = unittest.defaultTestLoader.discover('./case','ww*.py')

# runner = unittest.TextTestRunner()
# runner.run(suite)
unittest.TextTestRunner().run(suite)

就一个是自己创的一个是默认的

同一目录下

suite = unittest.defaultTestLoader.discover('.','ww*.py')

Fixture

方法级别:每个测试方法前后执行一次 类级别:每个类来一次

1,5执行一次

2,3,4小循环

Fixture 是写在UnitTest里面写的

import unittest

class TestLogin(unittest.TestCase):
    def setUp(self):
        """每个测试方法执行之前会使用的方法"""
        print('输入网址')

    def tearDown(self) -> None:
        """每个测试方法执行之后会使用的方法"""
        print('关闭当前页面')
    @classmethod
    def setUpClass(cls) -> None:
        print('---------打开浏览器')
    @classmethod
    def tearDownClass(cls) -> None:
        print('----------关闭浏览器')
    def test_1(self):
        print('输入1')
    def test_2(self):
        print('输入2')

断言

assertEqual(预期结果,实际结果)

判断预期结果和实际结果是否相等

如果相等 用例通过

如果不相同 用例不通过 抛出异常

assertIn(预期结果,实际结果)

判断预期结果是否包含在实际结果中

1.包含,用例通过

2.不包含,用例不通过,抛出异常

缺点:只能在unitcase中用 生成测试报告

核心:预期和实际结果不一样 就是失败了 就是用例不通过

def test_method4(self):
    username = 'aaa'
    password = '123123'
    # self.assertEqual('登录失败', d110.login(username, password))
    self.assertIn('失败',d110.login(username, password))

参数化

pip list 查看所安装的包

from parameterized import parameterized
import unittest

from d110 import login

data = [
    ('admin','123456','登录成功'),
    ('root','123456','登录失败'),
    ('admin','123123','登录失败'),
    ('aaa','123123','登录失败')
]

class TestLogin(unittest.TestCase):# 在这里运行
    @parameterized.expand(data)
    def test_login(self,username,password,expect):
        self.assertEqual(expect, login(username,password))

直接导入json

[
    {
        "desc": "错误的用户名",
        "username": "root",
        "password": "123456",
        "expect": "登录失败"
    },
    {
        "desc": "错误的密码",
        "username": "admin",
        "password": "123123",
        "expect": "登录失败"
    },
    {
        "desc": "正确",
        "username": "admin",
        "password": "123456",
        "expect": "登录成功"
    }
]
import unittest
from parameterized import parameterized
import json
from d110 import login

def load():
    with open('ee.json', 'r', encoding='utf-8') as f:
        result = json.load(f)
        list = []
        for i in result:
            list.append((i.get('username'), i.get('password'), i.get('expect')))
        return list

class TestDemo(unittest.TestCase):
    @parameterized.expand(load())
    def test_login(self,username,password,expect):
        self.assertEqual(expect,login(username,password))

跳过

@装饰器 1.直接 2.条件 判断条件成立跳过

import unittest
import d110

version = 4.0
class TestLogin(unittest.TestCase):
    @unittest.skip('跳过的原因')
    def test_method1(self):
        username = 'admin'
        password = '123456'
        self.assertEqual('登录成功',d110.login(username,password))
    @unittest.skipIf(version>3.0,'version >3.0 不用测试')
    def test_method2(self):
        username = 'root'
        password = '123456'
        self.assertEqual('登录失败', d110.login(username, password))
    def test_method3(self):
        username = 'admin'
        password = '123123'
        self.assertEqual('登录失败', d110.login(username, password))
    def test_method4(self):
        username = 'aaa'
        password = '123123'
        # self.assertEqual('登录失败', d110.login(username, password))
        self.assertIn('失败',d110.login(username, password))

测试报告

import unittest

from HtmlTestRunner import HTMLTestRunner


class MyTest1(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(1 + 1, 2)


class MyTest2(unittest.TestCase):
    def test_subtraction(self):
        self.assertEqual(2 - 1, 1)


test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(MyTest1))
test_suite.addTest(unittest.makeSuite(MyTest2))

output_file = "test_report.html"

with open(output_file, "w", encoding='utf-8') as file:
    runner = HTMLTestRunner(stream=file)
    runner.run(test_suite)
import unittest
from HtmlTestRunner import HTMLTestRunner

suite = unittest.defaultTestLoader.discover('./case', 'ww*.py')

file = 'case.html'
with open(file, 'w',encoding='utf-8') as f:
    runner = HTMLTestRunner(stream=f,verbosity=2,report_title='测试报告',descriptions='python')
    runner.run(suite)

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值