GVKun编程网logo

暂时禁用单个Python单元测试(暂停python程序)

18

如果您对暂时禁用单个Python单元测试感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于暂时禁用单个Python单元测试的详细内容,我们还将为您解答暂停python程序的相关

如果您对暂时禁用单个Python单元测试感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于暂时禁用单个Python单元测试的详细内容,我们还将为您解答暂停python程序的相关问题,并且为您提供关于Django中的单元测试以及Python单元测试、python – 如何在执行Django单元测试时禁用第三方API?、Python 使用单元测试、python单元测试的有价值信息。

本文目录一览:

暂时禁用单个Python单元测试(暂停python程序)

暂时禁用单个Python单元测试(暂停python程序)

unittest在Python中使用模块时,如何暂时禁用单个单元测试?

Django中的单元测试以及Python单元测试

Django中的单元测试以及Python单元测试

Python单元测试

  是用来对一个模块、一个函数或者一个类进行正确性检验的测试工作。

  在Python中unittest是它内置的单元测试框架,单元测试与功能测试都是日常开发中必不可少的部分。

  比如对函数abs(),我们可以编写出一下几个测试用例:

  •  输入正数,比如1,1.2,0.99,我们期待返回值与输入相同
  •  输入负数,比如-1,-1.2,-0.99,我们期待返回值与输入值相反
  •  输入0,我们期待返回0
  •  输入非数值类型,比如None,[],{},我们期待抛出TypeError

    把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。

一个简单的测试用例

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

  待测试文件m1.py

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 class MyClass(object):
 6     def __init__(self, x, y):
 7         self.x = int(x)
 8         self.y = int(y)
 9 
10     def add(self):
11         return self.x + self.y
12 
13     def sub(self):
14         return self.x - self.y

  在m1.py同级目录下创建test.py测试文件,使用unittest单元测试框架对MyClass的方法进行测试

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import unittest
 5 from m1 import MyClass
 6 
 7 
 8 class MyclassTest(unittest.TestCase):
 9     def setUp(self):
10         self.calc = MyClass(7, 5)
11 
12     def tearDown(self):
13         pass
14 
15     def test_add(self):
16         ret = self.calc.add()
17         self.assertEqual(ret, 12)
18 
19     def test_sub(self):
20         ret = self.calc.sub()
21         self.assertEqual(ret, 2)
22 
23 
24 # if __name__ == ''__main__'':
25 #     suite = unittest.TestSuite()
26 #     suite.addTest(MyclassTest(''test_add''))
27 #     suite.addTest(MyclassTest(''test_sub''))
28 #
29 #     runner = unittest.TextTestRunner()
30 #     runner.run(suite)
31 
32 if __name__ == ''__main__'':
33     unittest.main()

 运行测试

1 python -m unittest test
2 ..
3 ----------------------------------------------------------------------
4 Ran 2 tests in 0.000s
5 
6 OK

总结:

  编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承,unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual()方法

运行单元测试: 

1 一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在test.py的最后加上两行代码:
2 if __name__ == ''__main__'':
3     unittest.main()
4 这样就可以把test.py当做正常的python脚本运行:
5 $ python test.py
6 另一种方法是在命令行通过参数-m unittest直接运行单元测试:
7 $ python -m unittest test

 unittest框架小知识点梳理

  1. test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()和tearDown()方法实现

    两方法使用:设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:    

1 class MyclassTest(unittest.TestCase):
2 
3     def setUp(self):
4         print(''setUp...'')
5 
6     def tearDown(self):
7         print(''tearDown...'')

  2.test case:是测试用例

  3.test suite:是测试用例的集合,通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例

  4.test runner:是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suite或test case  

 注意:

  单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug

Django中的单元测试

  在创建app的时候,在app目录下自动生成tests.py文件

  Model部分单元测试用例  

1 from django.db import models
2 
3 # Create your models here.
4 
5 
6 class Book(models.Model):
7     title = models.CharField(max_length=32)
8     price = models.DecimalField(max_digits=10, decimal_places=2)

  测试用例代码  

 1 from django.test import TestCase
 2 from app01.models import Book
 3 # Create your tests here.
 4 
 5 
 6 class BookModelTest(TestCase):
 7     def setUp(self):
 8         Book.objects.create(title=''斗破苍穹'', price=10.99)
 9 
10     def test_book_model(self):
11         from decimal import Decimal
12         result = Book.objects.get(title=''斗破苍穹'')
13         self.assertEqual(result.price, Decimal(''10.99''))

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

1 python manage.py test
2 Creating test database for alias ''default''...
3 System check identified no issues (0 silenced).
4 .
5 ----------------------------------------------------------------------
6 Ran 1 test in 0.002s
7 
8 OK
9 Destroying test database for alias ''default''...

视图部分单元测试用例  

1 from django.shortcuts import render
2 
3 # Create your views here.
4 
5 
6 def index(request):
7     return render(request, ''index.html''

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

1 class IndexPageTest(TestCase):
2     """测试index页面"""
3     def test_index_page_renders_index_template(self):
4         """测试index视图"""
5         response = self.client.get(''/index/'')
6         self.assertEqual(response.status_code, 200)  # 判断状态码
7         self.assertTemplateUsed(response, ''index.html'')  # 判断渲染的模板是否正确

运行单元测试:

1 python manage.py test
2 Creating test database for alias ''default''...
3 System check identified no issues (0 silenced).
4 ..
5 ----------------------------------------------------------------------
6 Ran 2 tests in 0.044s
7 
8 OK
9 Destroying test database for alias ''default''...

 

python – 如何在执行Django单元测试时禁用第三方API?

python – 如何在执行Django单元测试时禁用第三方API?

我正在尝试针对Django中的某些代码构建一些单元测试,这些代码运行针对第三方API的操作.具体来说,我正在使用MailChimp同步一些用户数据并使用实现MailChimp API的库.

我有一个自定义类MailChimpAPI,它本质上充当我正在使用的Python库的瘦包装器.以下是代码的一些相关部分:

class MailChimpAPI(object):
    """
    A wrapper for implementing business logic and exception handling around
    the PyChimp API
    """
    ...

    def __init__(self,api_key,primary_list_id,merge_keys,use_secure=True,timeout=None):
        ...

        # setup api
        self.api_key = api_key
        self.api = PyChimp(self.api_key)

        ...

    ...


    def _call(self,method_name,args=[],kwargs={}):
        """Calls the PyChimp API directly"""
        result = getattr(self.api,method_name)(*args,**kwargs)
        if self.api.errorCode:
            self._raise_mailchimp_exception()
        else:
            return result

    ...

我剪掉了(…)实现业务逻辑等的大多数代码,但这里的突出方面是我将api属性设置为__init __()中的PyChimp(第三方库)实例,以及所有对该库的实际调用是在_call()函数中进行的.

我对单元测试有些新意,所以我很难找到解决这个问题的最佳方法.我的一个想法是在我的类之外实例化PyChimp库并将其传递给构造函数.另一个想法是测试这个我可以模拟_call方法,以便它不会碰到实际的库.

我遇到的首要问题是,显然,我不想针对实际的API执行任何测试代码.因此,我试图找出“存根”或“模拟”该API的最佳方法,以便在测试期间对其进行的调用实际上不会执行.理想情况下,我希望在Django测试套件中运行所有测试时都存在该模拟API.例如,每当通过post_save信号创建用户帐户时,我正在探索将用户同步到MailChimp的可能性.出于这个原因,我显然不希望在Django身份验证应用程序中运行的测试也触发实际的API.

我希望Django有一些全局设置/拆卸挂钩或我可以使用的信号,但似乎没有任何东西.

有没有人对如何在测试过程中用假装一个干净地替换“实时”API有任何建议?或者我完全错了吗?

我非常有信心我可以通过自己的方式找到解决方案,但如果有人能够分享一些关于采用这种方式的“最佳”方式的智慧,那将会很棒.

解决方法

最好的方法可能是你建议的,在外面创建api对象并将其传递给构造函数.这将允许您轻松替换api类进行测试.

您可以创建一个MockPyChimp类,它具有与实际PyChimp api相同的方法.这样,您可以轻松地在测试中重用相同的模拟类.

我对python / django单元测试不够熟悉,能够建议任何特定的库来协助这个,但我会假设存在某种类似的模拟库.

Python 使用单元测试

Python 使用单元测试

单元测试是用来对一个函数、一个类或者一个模块进行正确性检验的测试工作。

使用 unittest 模块做单元测试


 1)对函数进行测试

下面是一个简单的函数,它接收名和姓,返回整洁的姓名:

name_function.py

def get_formatted_name(first, last):
    full_name = first + '' '' + last
    return full_name.title()

函数 get_formatted_name 将名和姓组成一个完整的名字,并在名和姓之间添加一个空格,同时将首字母大写,再返回结果。

单元测试这样写:

test_name_function.py

import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
    '''''' test_function Begin''''''
    def test_first_last_name(self):
        formatted_name = get_formatted_name(''du'',''xiaodong'')
        self.assertEqual(formatted_name,''Du Xiaodong'')

unittest.main()

需要注意的是,1. 引入了 unittest 模块并且 NamesTestCase 需要继承 unittest.TestCase 类。2. 所有的测试函数都需要是 test_function 开头,并且需要在代码最后执行 unittest.main ()

当执行测试文件时,测试用例就会被自动执行。如果你的测试正确,执行 python test_name_function.py,显示如下:

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

 

2)对类进行测试

这里写一个类 Employee,其中__init__() 接收姓名和年薪,其中 give_raise () 这个方法是加薪,默认加薪 5000。

Employee.py

class Employee():
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
    def give_raise(self,money = 5000):
        self.salary +=  money

测试类 test_Employee.py

import unittest
from Employee import Employee

class TestEmployee(unittest.TestCase):
    def setUp(self):
        self.employee = Employee(''Du Xidong'', 100000)

    def test_raise(self):
        self.employee.give_raise(10000)
        self.assertEqual(110000,self.employee.salary)

unittest.main()

这里需要指出的是 setUp () 这个方法类构造的时候会被执行,然后运行 python test_Employee.py 会得到如下的结果:即测试用例通过

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

总结


 1、单元测试类必须继承 unit.TestCase 类,2、测试函数必须以 test_function 开头,3、使用断言 assertEqual 或者其他单元具体查看 unittest module 中的断言方法 assertIn (item,list) 等

 

python单元测试

python单元测试

示例代码:

#coding:utf-8

import unittest

class Template(unittest.TestCase):
    
    def setUp(self,tclass):   #初始化
        self.tclass = tclass
    
    def tearDown(self):  #清除功能
        pass
    
    def testFunc(self):  #必须是testXXX
        pass

class FuncTest(unittest.TestCase):
    
    def test_add(self):
        self.assertEqual(1+2, 5, "功能测试")

class AntiTest(unittest.TestCase):
    
    def test_sub(self):
        self.assertIsNot(1+2, 5, "反例测试")
        
class RasiTest(unittest.TestCase):
    
    def test_sub(self):
        self.assertRaises(ZeroDivisionError, 1/0)
        
def suite():
    
    def tosuite(testCaseClass):
        return unittest.makeSuite(testCaseClass)
    
    suite = unittest.TestSuite()
    suite.addTest(tosuite(FuncTest))
    suite.addTest(tosuite(AntiTest))
    suite.addTest(tosuite(RasiTest))
    
    return suite

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

除了可以使用main来实施测试还可以使用TextTestRunner

# 测试
if __name__ == "__main__":
    # 构造测试集
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase("testSize"))
    suite.addTest(WidgetTestCase("testResize"))
    
    # 执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

参考链接

https://www.ibm.com/developerworks/cn/linux/l-pyunit/

今天关于暂时禁用单个Python单元测试暂停python程序的讲解已经结束,谢谢您的阅读,如果想了解更多关于Django中的单元测试以及Python单元测试、python – 如何在执行Django单元测试时禁用第三方API?、Python 使用单元测试、python单元测试的相关知识,请在本站搜索。

本文标签: