python实战演练_Python 单元测试 实战演练

结合实例,联系单元测试。

文件结构:

|----Python_unittest

|--------math_operation.py    # 定义了类【class MathOperation:】,类里面定义了初始化函数,以及加减乘除4个实例方法

|--------two_num_delete.py     # 定义了类【class TestDelete(unittest.TestCase):】,类里面定义了测试减法的用例

|--------two_num_divide.py    # 定义了类【class TestDivide(unittest.TestCase):】,类里面定义了测试除法的用例

|--------unittest_suite.py

1.two_num_delete.py

import unittes

from Python_unittest.math_operation import MathOperation

class TestDelete(unittest.TestCase):

@classmethod

def setUpClass(cls):

"""

在执行所有用例之前,会调用setUpClass类属性

:return:

"""

log_file_name = "math_operation_result_log.txt"

cls.one_file = open(log_file_name, mode="a", encoding="utf-8")

print(f"打开【{log_file_name}】文件")

cls.one_file.write("\n{:=^40s}\n".format("开始执行【减法】的测试用例"))

@classmethod

def tearDownClass(cls):

"""

在所有用例执行之后, 会调用一次tearDownClass类属性

:return:

"""

cls.one_file.write("{:=^40s}\n".format("【减法】的测试用例执行结束"))

cls.one_file.close()

def test_delete0(self):

real_result = MathOperation(9, 6).delete()

expect_value = 3

try:

self.assertEqual(expect_value, real_result, msg="两数相减异常")

print("a>b>0, a-b的结果正常")

self.one_file.write("a>b>0时, a-b测试的结果为:Pass\n")

except AssertionError as err:

print(f"具体异常为:{err}")

self.one_file.write(f"a>b>0时, a-b测试的结果为:Fail\n具体异常为{err}")

raise err

def test_delete1(self):

real_result = MathOperation(-9, -6).delete()

expect_value = -3

try:

self.assertEqual(expect_value, real_result, msg="两数相减异常")

print("a

self.one_file.write("a

except AssertionError as err:

print(f"具体异常为:{err}")

self.one_file.write(f"a

raise err

2.two_num_divide.py

import unittest

from Python_unittest import MathOperation

class TestDivide(unittest.TestCase):

@classmethod

def setUpClass(cls):

"""

在执行所有用例之前都会执行的文件

:return:

"""

log_file_name = "math_operation_result_log.txt"

cls.one_file = open(log_file_name, mode="a", encoding="utf-8")

print(f"打开【{log_file_name}】文件")

cls.one_file.write("\n{:=^40s}\n".format("开始执行【除法】的测试用例"))

@classmethod

def tearDownClass(cls):

"""

在所有用例执行之后, 会调用一次tearDownClass类属性

:return:

"""

cls.one_file.write("{:=^40s}\n".format("【除法】的测试用例执行结束"))

cls.one_file.close()

def test_divide0(self):

real_result = MathOperation(9, 3).divide()

expect_result = 3

try:

self.assertEqual(expect_result, real_result, msg="两数相除异常")

print("a>b>0,a/b的结果正常")

self.one_file.write("a>b>0,a/b的测试结果为:Pass\n")

except AssertionError as err:

print(f"具体异常为:{err}")

self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail\n具体异常为{err}")

raise err

def test_divide1(self):

real_result = MathOperation(9, -3).divide()

expect_result = 9

try:

self.assertEqual(expect_result, real_result, msg="两数相除异常")

print("a>0>b,a/b的结果正常")

self.one_file.write("a>b>0,a/b的测试结果为:Pass\n")

except AssertionError as err:

print(f"具体异常为:{err}")

self.one_file.write(f"a>b>0时, a/b测试的结果为:Fail\n具体异常为{err}\n")

raise err

3.unittest_suite.py

import unittest

from Python_unittest import two_num_divide as num_divide

from Python_unittest import two_num_delete as num_delete

# 定义一个【套件】

one_suite = unittest.TestSuite()

# 定义【加载器】

# 通过加载器加载用例,并添加到套件中

one_loader = unittest.TestLoader()

one_suite.addTest(one_loader.loadTestsFromModule(num_divide))

one_suite.addTest(one_loader.loadTestsFromModule(num_delete))

# 定义【运行器】 one_runner = unittest.TextTestRunner() one_runner.run(one_suite)

【知识点】

one_suite.addTest(one_loader.loadTestsFromModule(num_divide))  是向套件中一个一个地添加加测试模块的用例

one_suite.addTests(one_loader.loadTestsFromModule(num_divide),one_loader.loadTestsFromModule(num_delete))  可以同时添加多个模块测试用例

执行顺序与添加顺序有关。

4.运行结果:

fc641f14bb37c77b1a130f970f68395bfd8.png

【知识点】

注意捕获异常时一定要抛出异常,用例的总数是:以test_开头的所有方法的个数,失败数则是根据抛出的【断言异常AssertionError】来统计的。

.代表运行成功,F代表运行失败。

用例执行的顺序:

loadTestsFromModele()方法先添加哪个模块就先执行哪个。

在加载的模块内部,是根据方法的ASCII码的顺序执行测试用例。

defaultTestLoader.discover()默认根据ASCII码的顺序加载测试用例。

5.unittest_discover.py

import unittest

one_suite = unittest.defaultTestLoader.discover(".")

one_runner = unittest.TextTestRunner()

one_runner.run(one_suite)

【知识点】

def discover(self, start_dir, pattern='test*.py', top_level_dir=None):

默认加载路径下以“test”开头的模块,所以测试用例的模块应当都是以test开头。

.代表当前py文件所在的路径。

也可以指定绝对路径:one_suite = unittest.defaultTestLoader.discover(r"C:\Users\zfy\PycharmProjects\Python_unittest")

6. 生成的log文件

math_operation_result_log.txt

e9aae0cd6ab4cb46223063ddfcaeb8e6109.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值