PYTHON | unittest单元测试入门

news/2025/2/26 7:11:53

参考:
https://zhuanlan.zhihu.com/p/55528807
https://www.jianshu.com/p/07f0847fa667


1.

test_article.py:

import unittest

class MyTestCase(unittest.TestCase):
    def setUp(self):
        print("环境预测")

    def test_something(self):
        print("测试用例")
        self.assertEquals(True, False)

    def tearDown(self):
        print("环境销毁")

if __name__ == '__main__':
    unittest.main()

执行

python test_article.py

输出
在这里插入图片描述
在这里插入图片描述

2.

test_article.py:

# coding=utf-8
import unittest

class TestCase1(unittest.TestCase):
    def testCase1(self):
        print("一")

    def testCase2(self):
        print("二")


class TestCase2(unittest.TestCase):
    def testCase1(self):
        print("三")

    def testCase2(self):
        print("四")

if __name__ == '__main__':
    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestCase1)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(TestCase2)
    suite = unittest.TestSuite([suite1, suite2])
    unittest.TextTestRunner(verbosity=2).run(suite)

执行

python test_article.py

输出
在这里插入图片描述
在这里插入图片描述

3.

# coding=utf-8
import unittest

class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("环境预测")

    @classmethod
    def tearDownClass(cls):
        print("环境销毁")

    def test_1(self):
        print("一")
    def test_2(self):
        print("二")
    def test_3(self):
        print("三")



if __name__ == '__main__':
    unittest.main()

在这里插入图片描述


4. flask测试

# coding=utf-8
import unittest,os
from app import app

class WatchlistTestCase(unittest.TestCase):
    def setUp(self):
        # 使用flask提供的测试客户端进行测试,flask自带测试客户端,直接模拟终端请求
        self.client = app.test_client()

    # 测试URL
    def test_url(self):
        print("======测试URL========")
        response = self.client.get('/')
        data = response.get_data(as_text=True)
        self.assertIn('全文检索', data)
        self.assertIn('使用说明', data)
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/404')
        data = response.get_data(as_text=True)
        self.assertIn('抱歉', data)
        self.assertEqual(response.status_code, 404)

        response = self.client.get('/read')
        data = response.get_data(as_text=True)
        self.assertIn('序号', data)
        self.assertEqual(response.status_code, 200)

        response = self.client.get('/article/2010')
        data = response.get_data(as_text=True)
        self.assertIn('返回', data)
        self.assertEqual(response.status_code, 200)

        print("======URL测试通过========")

    # 测试输入为空
    def test_empty_query(self):
        print("=====测试输入为空======")
        response = self.client.post("/", data={"query": ""})
        data = response.get_data(as_text=True)
        self.assertIn('请在搜索框输入您想要查询的内容~', data)
        print("=====输入为空测试通过======")

    # 测试正常输入
    def test_normal_query(self):
        print("=====测试正常输入======")
        response = self.client.post("/", data={"query": "搜索"})
        data = response.get_data(as_text=True)
        self.assertIn('结果', data)
        print("=====正常输入测试通过======")

    # 测试继续搜索
    def test_continue_search(self):
        print("=====测试继续搜索======")
        response = self.client.post("/", data={"query": "【搜索】"})
        data = response.get_data(as_text=True)
        self.assertIn('结果', data)
        print("=====继续搜索测试通过======")

    # 测试错误输入
    def test_wrong_query(self):
        print("=====测试错误输入======")
        response = self.client.post("/", data={"query": "砖业"})
        data = response.get_data(as_text=True)
        self.assertIn('仍然', data)
        print("=====错误输入测试通过======")

    # 测试文章简介
    def test_article_introduction(self):
        print("=====测试文章简介======")
        path = "assets\\books"  # 文件夹目录
        files = os.listdir(path)  # 得到文件夹下的所有文件名称
        for file in files:
            title = file[0:-4]
            response = self.client.post("/read", data={"title": title})
            data = response.get_data(as_text=True)
            self.assertIn('阅读原文', data)
        print("=====文章简介测试通过======")

    # 测试阅读原文
    def test_article(self):
        print("=====测试阅读原文======")
        path = "assets\\books"  # 文件夹目录
        files = os.listdir(path)  # 得到文件夹下的所有文件名称
        for file in files:
            title = file[0:-4]
            path = '/article/' + title
            response = self.client.get(path)
            data = response.get_data(as_text=True)
            self.assertIn('返回', data)
            self.assertEqual(response.status_code, 200)
        print("=====阅读原文测试通过======")

if __name__ == '__main__':
    unittest.main()

5. 覆盖率

执行:

coverage run --source=app test_article.py
coverage report

结果(覆盖率报告):
在这里插入图片描述

从上面的表格可以看出,一共有 98 行代码,没测试到的代码有 9 行,测试覆盖率为 91%。


http://www.niftyadmin.cn/n/697834.html

相关文章

系分 | 第六周作业

简答题 用例的概念 用例是一系列相关的成功和失败场景的集合,这些场景描述了一个参与者使用一个系统来支持一个目标。用例是功能或行为需求,指示系统将做什么。就FURPS需求类型而言,它们强调“F”,但也可以用于其他类型。 用例和…

强大视频电影播放软件——乐鱼影音盒!

强大视频电影播放软件——乐鱼影音盒!乐鱼视频电影播放软件比起网页直接观看的要强上好几百倍,此版本为最新版本,优化了播放时IE自动加速,让我们欣赏电影时不再受到被卡或者无法观看的现象,可与PPS等主流软件媲美&…

系分 | 第七周作业(用例图、活动图、多泳道图)

使用 UMLet 建模: 1、根据订旅馆建模文档,Asg-RH.pdf: 绘制用例图模型(到子用例) 给出 make reservation 用例的活动图 2、根据课程练习“投递员使用投递箱给收件人快递包裹”的业务场景 分别用多泳道图建模三个场景…

Qt学习之路(30): Graphics View Framework

现在基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,现在我们就要来看看在绘图部分功能最强大的Graphics View。我们经常说KDE桌面,新版本的KDE桌面就是建立在Graphics View的基础之上,可见其强大之处。Qt的白皮书…

软件测试 | assignment4

OperatorNumber of Occurrencesif1<11–1int16*2/4%1dayray1return1n1 11N1 20 OperandNumber of Occurrencesmonth331121year5day11126110141611001400171n2 13N2 19 Halstead Metrics n111,n213,N120,N219n_1 11 , n_2 13, N_1 20, N_2 19n1​11,n2​13,N1​20,N2…

Ref和Out区别

ref和out都是C#中的关键字&#xff0c;所实现的功能也差不多&#xff0c;都是指定一个参数按照引用传递。对于编译后的程序而言&#xff0c;它们之间没有任何区别&#xff0c;也就是说它们只有语法区别。总结起来&#xff0c;他们有如下语法区别&#xff1a; 1. ref传进去的参数…

智慧人生--走出心灵的低谷

这是一位朋友指名点姓要我回答的&#xff0c;呵呵&#xff0c;恭敬不如从命了。一家之言哈&#xff0c;欢迎拍砖。原文&#xff1a;肖老师&#xff1a;您好&#xff0c;希望您能早点看到我写的信。我现在的心情很乱&#xff0c;很烦&#xff0c;很糟糕&#xff0c;不能用语言说…

nlp | 第13周作业 知识图谱

"kg:"是RDF文件中所定义的prefix&#xff0c;如下所示&#xff1a; prefix kg: http://www.kg.com/person/liudehua/ 即&#xff0c;kg:chineseName其实就是"http://www.kg.com/person/liudehua/chineseName"的缩写。