Python项目中的单元测试

引入

单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架。 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元测试框架的基本使用。

一个简单的测试例子

定义一个类,简单的实现addsub两个方法,并对其进行单元测试。

待测试的m1.py文件内容如下:

class MyClass(object):
    """just a test case"""
    def __init__(self, x, y):
        self.x = int(x)
        self.y = int(y)

    def add(self):
        return self.x + self.y

    def sub(self):
        return self.x - self.y

在与m1.py同级的目录下创建test.py测试文件,使用unittest单元测试框架对A类的方法进行测试。代码内容如下:

import unittest
from m1 import MyClass

class MyClassTest(unittest.TestCase):
    def setUp(self):
        self.calc = MyClass(7, 5)

    def tearDown(self):
        pass

    def test_add(self):
        ret = self.calc.add()
        self.assertEqual(ret, 12)

    def test_sub(self):
        ret = self.calc.sub()
        self.assertEqual(ret, 2)

if __name__ == ‘__main__‘:
    # 构造测试集
    suite = unittest.TestSuite()
    suite.addTest(MyClassTest(‘test_add‘))
    suite.addTest(MyClassTest(‘test_sub‘))
    # 执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

运行测试:

demo1 $ python3 test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

到此一个简单的单元测试就完成了。

unittest框架知识点

unittest框架中4个重要的概念:

  1. test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()tearDown()方法来实现
  2. test case:是测试用例
  3. test suite:是测试用例的集合(俗称测试套件),通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例。
  4. test runner:的作用是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suitetest case

Django中的单元测试

Django项目的app目录下都默认生成了一个

Model部分单元测试用例

假设项目中有一个Book的model:

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=10, decimal_places=2)

测试用例代码:

# app01/tests.py
from django.test import TestCase
from app01.models import Book
# Create your tests here.

class BookModelTest(TestCase):
    def setUp(self):
        Book.objects.create(title=‘书名‘, price=11.11)

    def test_book_model(self):
        from decimal import Decimal
        result = Book.objects.get(title=‘书名‘)
        self.assertEqual(result.price, Decimal(‘11.11‘))

运行测试,在项目目录下运行:

$ python3 manage.py test
Creating test database for alias ‘default‘...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.003s

OK
Destroying test database for alias ‘default‘...

测试用例OK…

视图部分单元测试用例

假设我们有个index视图,代码如下:

def index(request):
    return render(request, ‘index.html‘)

app01/tests.py文件中添加测试用例代码:

# app01/tests.py
class IndexPageTest(TestCase):
    """测试index页面"""
    def test_index_page_renders_index_template(self):
        """测试index视图"""
        response = self.client.get(‘/index/‘)
        self.assertEqual(response.status_code, 200)  # 判断状态码
        self.assertTemplateUsed(response, ‘index.html‘)  # 判断渲染的模板是否正确

在项目根目录运行python manage.py test命令:

$ python3 manage.py test
Creating test database for alias ‘default‘...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.027s

OK
Destroying test database for alias ‘default‘...

python manage.py test命令会查找当前项目中的tests.py文件,并运行测试用例。

原文地址:https://www.cnblogs.com/peng104/p/11364927.html

时间: 2024-10-03 05:02:34

Python项目中的单元测试的相关文章

Python项目中如何优雅的import

Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的import 标准库与第三方库的导入 导入一个模块, 如果模块名太长, 则使用import as; 如果是导入子模块, 则使用from import as 如果需要导入类的, 则使用from import导入类, 如果要导入某一个模块的多各类的话, 则类名使用逗号分隔 示例 导入sklearn中的svm中

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

参考:http://codereview.stackexchange.com/questions/20428/accessing-the-contents-of-a-projects-root-directory-in-python 有时候开发稍大一点的python项目,需要用到多个模块,多层目录.而在项目的子目录中的模块,有时候需要存取项目其他目录中的文件或模块. 比如: 项目文件布局如下: my_project|- main.py|- main.cfg|- module|  |- mod1.

项目中创建单元测试—VS2012

我们在每个项目的开发过程中,开发完一个功能,自己首先需要测试一下,VS提供了很方便的测试功能,可以很容易的创建单元测试,但是在VS2012中类名上点击右键没有『创建单元测试』这个菜单,需要先进行设置一下才会出来,选择VS上的菜单『工具』-『自定义』,如下图: 然后选择『命令』-『上下文菜单』-『编辑器上下文菜单|代码窗口』: 然后找到『创建单元测试』,将其移动到如下位置: 然后先关闭VS2012,然后重新打开项目,现在在类名上右键点击就可以看到『创建单元测试』,但是还是灰色的,处于禁用状态: 现

python 项目中的 requirements.txt

背景 java项目的话,包依赖一般都是maven管理,当然还有gradle,对于包的管理非常方便,maven的话只要在pom.xml中添加依赖包的maven坐标就可以了的,那python呢 ? 解决方法 现在的python版本都自带pip功能的,安装第三方包直接pip install xxx,和linux 上的yum一样方便,其实pip提供了一个freeze 功能,可以把已经安装的依赖导出到一个文件中,一般命名为:requirements.txt #导出依赖到requirements.txt p

如何在python项目中写出像Django中一样功能的settings

一  核心文件目录结构 二  实现代码 resdme: 在实现此功能主要用到的知识点及模块: 1.反射 3.内置方法dir # 全局配置 NAME = 'root' # 用户配置 NAME = 'personal' from lib.conf import global_settings # 全局默认配置 from config import setting # 用户个人配置 class Settings(): ''' 需要注意的是: 1.在初始化的时候要将全局的配资放在个人的前面 2.因为如果

怎么使用pipenv管理你的python项目

原文链接:https://robots.thoughtbot.com/how-to-manage-your-python-projects-with-pipenv 翻译者:Jiong 在thoughtbot,我们用Ruby和Rails工作,但通常我们总是尝试使用最合适的语言或者框架来解决问题.我最近一直在探索机器学习技术,所以Python使用地更多. Ruby项目和Python项目处理之间的一个很大的区别就是管理依赖关系方式的不同.目前在Python语言中没有类似于Bundler或Gemfile

Gitlab Pipeline+Supervisor 实战Python项目CI/CD

一.背景 谈到到CI/CD,我们不禁会想到Gitlab + Jenkins + Docker等一些列优秀的工具,Jenkins以其丰富的插件及灵活配置已经非常好的满足我们日常工作中的CI/CD需求,通常的做法为Gitlab配置webhook,开发人员通过push代码或merge request可以触发执行一些列的测试部署上线工作,打通了开发到部署到整个生命周期,完成持续集成持续构建.在Gitlab 也是具有一套CI/CD到框架,通过简单的注册Gitlab Runner,根据业务测试部署需求撰写

使用pipenv管理你的python项目

怎么使用pipenv管理你的python项目 原文链接:https://robots.thoughtbot.com/how-to-manage-your-python-projects-with-pipenv 在thoughtbot,我们用Ruby和Rails工作,但通常我们总是尝试使用最合适的语言或者框架来解决问题.我最近一直在探索机器学习技术,所以Python使用地更多. Ruby项目和Python项目处理之间的一个很大的区别就是管理依赖关系方式的不同.目前在Python语言中没有类似于Bu

Maven项目中mvn clean找不到测试类问题

在Maven项目中进行单元测试,但mvn clean后重新mvn install项目,再次进行单元测试,会有以下的错误, <span style="font-family:KaiTi_GB2312;font-size:18px;">Class not found com.core.order.service.impl.OrderServiceImplTest java.lang.ClassNotFoundException: com.core.order.service.i