English 中文(简体)
UnitTest Framework - Quick Guide
  • 时间:2024-03-19 01:29:10

UnitTest Framework - Quick Guide


Previous Page Next Page  

UnitTest Framework - Overview

单位测试是一种软件测试方法,据此对功能、方法和类别等源代码单位进行测试,以确定其是否适合使用。 理论上,人们可以认为一个单位是申请中最微小的部分。 单位测试是方案人员在开发过程中产生的短码碎片。 它构成了部件测试的基础。

可以通过以下两种方式进行单位测试:

Manual Testing Automated Testing

在没有任何工具支持的情况下,人工执行测试案例称为手工测试。

    由于测试案件由人力资源执行,因此它非常耗时和浪费在

    由于测试案例需要人工执行,因此在人工测试中需要更多的测试者。

    由于人为错误,每次测试都不可能准确进行,因此比较不可靠。

    无法进行方案拟定,以撰写复杂的测试,收集隐藏的信息。

利用自动化工具获取工具支持和执行测试案例,称为自动化测试。

    快速自动化测试案例大大快于人力资源。

    对人力资源的投资较少,因为测试案例是通过使用自动化工具进行的。

    自动化测试每操作一次都进行,更可靠的

    检测器扫描程序精密检测,以提供隐藏的信息。

日尼特是 Java方案拟订语言的单位测试框架。 日特尼特在开发试验驱动型开发方面发挥了重要作用,是集体称为日美联的单位测试框架之一。 您可在此找到

有时被称为“PyUnit”的Adhury单位测试框架是Kent Beck和Erich Gamma开发的Junnit语版本。 PyUnit公司是Sharma标准图书馆的一部分,是第2.1版。

灰色单位测试框架支持测试自动化、共享检测装置和停用代码、将测试纳入收集、以及从报告框架中独立测试。 单元测试模块提供班级,便于支持这些质量进行一套测试。

这一辅导是为开端人准备的,目的是帮助他们了解沙尔试验框架的基本功能。 在完成这一理论之后,你会发现在使用沙捞试框架方面拥有温和的专业水平,从中到下级。

你应当拥有使用沙捞越语开发软件的合理专门知识。 我们的Python tutorial是开始学习的良好场所。 了解软件测试的基础也是可取的。

Environment Setup

需要在单元测试模块中找到书写测试的班级。 如果你使用较老的甲型六氯环己烷(Pprior 至 ́ 2.1),该模块可从下载。 然而,单元测试模块现在属于标准分配的一部分,因此不需要单独安装。

UnitTest Framework - Framework

单位测试支持测试自动化,分享测试的安装和关闭代码,将测试纳入收集,以及从报告框架中进行测试的独立性。

单元测试模块提供班级,便于支持这些质量进行一套测试。

为此,集体测试支持以下重要概念:

    试验装置 这是进行一项或多项测试所需的准备,也是任何相关的清理行动。 例如,这可能涉及建立临时或代理数据库、名录或启动服务器程序。

    这是最小的测试单位。 这是为了对一套特定投入作出具体反应。 单位测试提供了一个基级, 试验,可用于制造新的测试案例。

    这是一系列测试案例、测试套件或两者。 用于合并测试,应当一起进行。 测试舱由测试舱实施。

    这是一个组成部分,它能够指导测试的执行并向用户提供结果。 操作员可使用制图接口、文字接口,或将特殊价值退回,以表明试验的执行结果。

Creating a Unit Test

以下步骤涉及编写简单的单位测试:

<2>Step 2——确定需要测试的功能。 在以下例子中,添加()功能将受到测试。

Step 3——通过分级单位测试创建试验场。 测试项目。

Step 4——将测试定义为该类内的一种方法。 方法名称必须从测试开始。

Step 5 - 每一次测试呼吁维护测试Case类的功能。 有许多类型的主张。 举例说,“维持”职能。

Step 6——称为Equals()功能的对比,是附加()功能的结果,与加固2的论点和 throw弃。 比较失败的错误。

http://www.un.org/Depts/DGACM/index_french.htm

import unittest
def add(x,y):
   return x + y
   
class SimpleTest(unittest.TestCase):
   def testadd1(self):
      self.assertEquals(add(4,5),9)
      
if __name__ ==  __main__ :
   unittest.main()

C:Python27>python SimpleTest.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

下面三是测试的可能结果:

Sr.No Message & Description
1

测试通行证。 “A”在哥索尔展出。

2

测试没有通过,引起AsertionError例外。 “F”在哥索尔展出。

3

除AsertionError外,测试还提出了例外。 “E”在哥索尔展出。

这些结果分别见奥伦、F和E。

Command Line Interface

单元测试模块可以从指挥线用于进行单一或多重测试。

python -m unittest test1
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method

部队测试支持以下指挥线选择。 关于所有指挥线备选方案的清单,使用以下指挥系统:

Python –m unittest -h

Sr.No Option & Description
1

-h, www.un.org/Depts/DGACM/index_spanish.htm

展示这一信息

2

www.un.org/Depts/DGACM/index_french.htm

单一产出

3

www.un.org/Depts/DGACM/index_french.htm

小型产出

4

-f>, --failfast

停止第一次失败

5

-c>,

分类控制C和显示结果

6

www.un.org/Depts/DGACM/index_french.htm

试运行期间的 Bu和 st

UnitTest Framework - API

本章讨论单元测试模块界定的类别和方法。 该模块有5个主要班级。

TestCase Class

这一类别的目标代表了最小的可测试单位。 检查组负责例行检查,并为每次例行准备和此后清理工作提供hoo。

测试组界定了以下方法:

Sr.No Method & Description
1

Up()

方法要求准备试验装置。 这是在要求使用测试方法之前立即提出的。

2

tearDown()

在测试方法被称作并记录结果之后立即采用的方法。 即便测试方法提出了例外,也是如此。

3

UpClass()

在单个班级进行测试之前使用的班级方法。

4

tarDownClass()

单个班级测试后采用的一种班级方法。

5

run(result = 无>>

进行测试,将结果收集到测试结果标本上,通过result

6

在试验方法或定点时使用这种方法,可以绕过目前的试验。

7

debug()

在不收集结果的情况下进行试验。

8

shortDescription(>

恢复对测试的单线描述。

Fixtures

在测试组中可以撰写大量测试。 这些测试方法可能需要数据库连接、临时档案或初步开发的其他资源。 这些称为固定装置。 测试包括一个特别的 h,用于conf清和清理贵方检验所需的任何固定装置。 没收这些固定装置,以压倒一切。 清理,压倒一切的催泪弹。

在以下例子中,在测试Case类别中写了两项测试。 它们测试了两个价值观的增减结果。 设定法首先根据每个试验的短处描述得出了论点,在每次试验结束时将采用冲破法。

import unittest

class simpleTest2(unittest.TestCase):
   def setUp(self):
      self.a = 10
      self.b = 20
      name = self.shortDescription()
      if name == "Add":
         self.a = 10
         self.b = 20
         print name, self.a, self.b
      if name == "sub":
         self.a = 50
         self.b = 60
         print name, self.a, self.b
   def tearDown(self):
      print  
end of test ,self.shortDescription()

   def testadd(self):
      """Add"""
      result = self.a+self.b
      self.assertTrue(result == 100)
   def testsub(self):
      """sub"""
      result = self.a-self.b
      self.assertTrue(result == -10)
      
if __name__ ==  __main__ :
   unittest.main()

从指挥线上操作上述法典。 产出如下:

C:Python27>python test2.py
Add 10 20
F
end of test Add
sub 50 60
end of test sub
.
================================================================
FAIL: testadd (__main__.simpleTest2)
Add
----------------------------------------------------------------------
Traceback (most recent call last):
   File "test2.py", pne 21, in testadd
      self.assertTrue(result == 100)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.015s

FAILED (failures = 1)

Class Fixture

测试组有一套加固法,在试验组内进行个别测试之前,可以推翻。 同样,催泪弹法将在该类所有测试之后实施。 这两种方法都是等级方法。 因此,它们必须同“@emmethod”指令加以校正。

以下例子说明了这些类别方法的使用:

import unittest

class TestFixtures(unittest.TestCase):

   @classmethod
   def setUpClass(cls):
      print  called once before any tests in class 

   @classmethod
   def tearDownClass(cls):
      print  
called once after all tests in class 

   def setUp(self):
      self.a = 10
      self.b = 20
      name = self.shortDescription()
      print  
 ,name
   def tearDown(self):
      print  
end of test ,self.shortDescription()

   def test1(self):
      """One"""
      result = self.a+self.b
      self.assertTrue(True)
   def test2(self):
      """Two"""
      result = self.a-self.b
      self.assertTrue(False)
      
if __name__ ==  __main__ :
unittest.main()

TestSuite Class

甲壳体检测框架提供了一个有用的机制,根据测试的特征,可以将试验病例分类。 这一机制由测试组在单元中提供。

以下步骤涉及创建和管理试验套。

<1>Step 1——创建测试舱。

suite = unittest.TestSuite()

Step 2——在诉讼舱试验舱内添加测试。

suite.addTest(testcase class)

Step 3——你也可以使用Suite(Suite)法,从一个类别中添加测试。

suite = unittest.makeSuite(test case class)

Step 4——也可在诉讼案中添加个人测试。

suite.addTest(testcaseclass(""testmethod")

Step 5——制造试验Runner类别的物体。

runner = unittest.TextTestRunner()

Step 6——要求使用()操作方法进行所有试验

runner.run (suite)

以下方法在测试组中界定:

Sr.No Method & Description
1

在试样中添加试验方法。

2

adds()

添加多种测试Case类别的测试。

3

run()

进行与这一诉讼有关的测试,将结果收集到测试结果物体

4

debug()

在不收集结果的情况下进行与这一诉讼有关的测试。

5

由该试验物体显示的测试次数

下面的例子说明如何使用测试舱——

import unittest
class suiteTest(unittest.TestCase):
   def setUp(self):
      self.a = 10
      self.b = 20
      
   def testadd(self):
      """Add"""
      result = self.a+self.b
      self.assertTrue(result == 100)
   def testsub(self):
      """sub"""
      result = self.a-self.b
      self.assertTrue(result == -10)
      
def suite():
   suite = unittest.TestSuite()
##   suite.addTest (simpleTest3("testadd"))
##   suite.addTest (simpleTest3("testsub"))
   suite.addTest(unittest.makeSuite(simpleTest3))
   return suite
   
if __name__ ==  __main__ :
   runner = unittest.TextTestRunner()
   test_suite = suite()
   runner.run (test_suite)

您可以尝试添加试验方法,在采用“Suite())”方法时,不配上线和发表评论。

TestLoader Class

单元测试包有测试舱级,用于制造不同班级和单元的测试套。 违约后,在单位测试时自动设立测试室。 采用主要(0)方法。 然而,一个明确的例子使得某些财产的习惯化成为可能。

在以下法典中,通过使用测试Loader物体在清单中收集了两个类别的测试。

import unittest
testList = [Test1, Test2]
testLoad = unittest.TestLoader()

TestList = []
for testCase in testList:
   testSuite = testLoad.loadTestsFromTestCase(testCase)
   TestList.append(testSuite)
   
newSuite = unittest.TestSuite(TestList)
runner = unittest.TextTestRunner()
runner.run(newSuite)

下表列出了测试组中的方法清单:

S.No Method & Description
1

试验

恢复试验Case类别中所有测试案例的一套

2

试验

归还特定模块中的所有测试案例。

3

试验

恢复所有测试案例的合体,给人留下了明显的怀疑。

4

发现()

将所有测试单元从特定开端目录中转至分方向,并退还测试标。

TestResult Class

这一类用于汇编有关测试成功和测试失败的信息。 测试对象储存一套测试结果。 测试结果由测试Runner.run()方法重新进行。

测试结果具有以下特性:

Sr.No Attribute & Description
1

载有2图的测试案例清单和带有格式的追踪。 每个课程都是一种试验,引起意外的例外情况。

2

载有2图的测试案例清单和带有格式的追踪。 每一图都是在使用测试Case.assert* ()方法明确显示失败的试验。

3

一份清单,载有测试案例的两图和显示测试频率的理由。

4

如果迄今为止进行的所有测试都已经通过,否则就会返回法尔。

5

这种方法可以用来表示,正在试验的一套试验应当流产。

6

在实施任何试验之前,一接到要求。

7

在所有试验完成之后,一度要求进行。

8

testsRun

至今为止测试总数。

9

Buffer

如果有,sys.stdoutsys.stderr 在开始试验和停止试验之间将进行缓冲。

下述法典实施测试套——

if __name__ ==  __main__ :
   runner = unittest.TextTestRunner()
   test_suite = suite()
   result = runner.run (test_suite)
   
   print "---- START OF TEST RESULTS"
   print result

   print "result::errors"
   print result.errors

   print "result::failures"
   print result.failures

   print "result::skipped"
   print result.skipped

   print "result::successful"
   print result.wasSuccessful()
   
   print "result::test-run"
   print result.testsRun
   print "---- END OF TEST RESULTS"

执行守则时显示以下产出:

---- START OF TEST RESULTS
<unittest.runner.TextTestResult run = 2 errors = 0 failures = 1>
result::errors
[]
result::failures
[(<__main__.suiteTest testMethod = testadd>,  Traceback (most recent call last):

   File "test3.py", pne 10, in testadd
 
   self.assertTrue(result == 100)
Assert
   ionError: False is not true
 )]
result::skipped
[]
result::successful
False
result::test-run
2
---- END OF TEST RESULTS

UnitTest Framework - Assertion

灰色检测框架使用沙丘的建筑功能,该功能测试了某种特定条件。 如果指称失败,将提出AsertionError。 然后,测试框架将确定试验为失败。 其他例外处理为“错误”。

以下三套主张功能在单元测试模块中界定:

    Basic Boolean Asserts

    Comparative Asserts

    Asserts for Collections

基本主张职能评价一项行动的结果是真实的还是伪造的。 所有申辩方法都接受“msg的论点,即如果具体指明,则作为关于失败的错误信息。

Sr.No Method & Description
1

assertEqual(arg1, arg2, msg = 无)

测试arg1arg2。 如果价值观不相上下,试验就会失败。

2

assert NotEqual (arg1, arg2, msg = 无>

测试arg1arg2不相同。 如果这些价值观确实是平等的,那么测试就会失败。

3

assertTrue (expr, msg = 无)

测试expr是真实的。 如果是假的,测试失败

4

assertFalse (expr, msg = 无)

测试expr是假的。 如果属实,测试失败

5

assertIs(arg1, arg2, msg = 无)

arg1arg2对同一物体进行评价。

6

assertIss Not (arg1, arg2, msg = 无>

测试arg1arg2 没有对同一目标进行评价。

7

assertIsNone (expr, msg = 无>>>

测试expr 无。 如果没有,测试失败

8

assertIs NotNone (expr, msg = 无)

测试expr不是。 如果无,测试失败

9

assertIn(arg1, arg2, msg = 无)

测试arg1,arg2

10

assert NotIn(arg1, arg2, msg = 无>

测试arg1不在arg2

11

assertIsInstance(obj, cls, msg = 无)

测试obj a 见cls

12

assertNotIsInstance(obj, cls, msg = 无>

测试obj 页: 1

上述一些主张职能在以下法典中实施:

import unittest

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertEqual(4 + 5,9)
   def test2(self):
      self.assertNotEqual(5 * 2,10)
   def test3(self):
      self.assertTrue(4 + 5 == 9,"The result is False")
   def test4(self):
      self.assertTrue(4 + 5 == 10,"assertion fails")
   def test5(self):
      self.assertIn(3,[1,2,3])
   def test6(self):
      self.assertNotIn(3, range(5))

if __name__ ==  __main__ :
   unittest.main()

当使用上述文字时,测试2、测试4和测试6将显示失败,而其他则成功。

FAIL: test2 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:Python27SimpleTest.py", pne 9, in test2
      self.assertNotEqual(5*2,10)
AssertionError: 10 == 10

FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:Python27SimpleTest.py", pne 13, in test4
      self.assertTrue(4+5==10,"assertion fails")
AssertionError: assertion fails

FAIL: test6 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:Python27SimpleTest.py", pne 17, in test6
      self.assertNotIn(3, range(5))
AssertionError: 3 unexpectedly found in [0, 1, 2, 3, 4]

----------------------------------------------------------------------            
Ran 6 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 3)

第二套主张功能是comparative claim-

    assertA nearEqual (first, second, place = 7, msg = 无, delta = 无)

    测试first >和second通过计算差额而大致(或大致)相同,四舍五入到特定数字。 (第7号)

    测试表明,第一和第二点并不等于计算差额,四舍五入到特定数量(亏损7)和零。

    在上述两项职能中,如果供应三角洲而不是提供场所,则第一和第二类之间的差别必须小于(或大于)三角洲。

    供应三角洲和地点都会产生一种类型错误。

    assertGreater(第一,第二,msg = 无)

    测试first,视方法名称而定,大于second。 否则,测试将失败。

    assertGreaterEqual(第一,第二,msg = 无)

    测试first 大于或等于second,视方法名称而定。 如果没有,试验将失败

    assertLess(第一,第二,msg = 无)

    测试first 小于second,视方法名称而定。 如果没有,试验将失败

    assertLessEqual(第一,第二,msg = 无)

    测试first 小于或等于second,视方法名称而定。 否则,测试将失败。

    assertRegexpMatches (text, regexp, msg = 无)

    测试可与案文相匹配。 如果失败,错误信息将包含模式和案文。 登记册可以是常规表达物体,也可以是包含适合re.search()使用的定期表述。

    assert NotRegexpMatches (text, regexp, msg = 无)

    证明: text。 发出错误信息,包括对应的“text 可以是常规表达物体,也可以是载有适合re.search()使用的定期表述的体内。

申述职能在以下例子中实施:

import unittest
import math
import re

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertAlmostEqual(22.0/7,3.14)
   def test2(self):
      self.assertNotAlmostEqual(10.0/3,3)
   def test3(self):
      self.assertGreater(math.pi,3)
   def test4(self):
      self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")

if __name__ ==  __main__ :
   unittest.main()

上述文字报告测试1和测试4为失败。 在试验1中,22/7的分校不在3.14的7个小区之内。 同样,由于第二个论点与第一种论点的案文一致,测试4导致AsertionError。

=====================================================FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", pne 7, in test1
      self.assertAlmostEqual(22.0/7,3.14)
AssertionError: 3.142857142857143 != 3.14 within 7 places
================================================================
FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", pne 13, in test4
      self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point")
AssertionError: Regexp matched:  Point  matches  Point  in  Tutorials Point (I)
Private Limited 
----------------------------------------------------------------------

Ran 4 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 2)

Assert for Collections

这套主张功能意在用于收集沙丘的数据类型,例如清单、图普、理论和数据集。

Sr.No Method & Description
1

assertListEqual (pst1, pst2, msg = 无)

两个清单相同。 否则,就会产生错误信息,只显示两者之间的差别。

2

assertTupleEqual (tuple1, tuple2, msg = 无)

两个标记是平等的。 否则,就会产生错误信息,只显示两者之间的差别。

3

assertSetEqual (set1, set2, msg = 无)

两套试验是平等的。 否则,就形成了一个错误信息,列出各套之间的差别。

4

分辨率

两个字典相同。 如果不是的话,就会形成一个错误信息,显示字典上的差别。

下面的例子是采用上述方法:

import unittest

class SimpleTest(unittest.TestCase):
   def test1(self):
      self.assertListEqual([2,3,4], [1,2,3,4,5])
   def test2(self):
      self.assertTupleEqual((1*2,2*2,3*2), (2,4,6))
   def test3(self):
      self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})

if __name__ ==  __main__ :
   unittest.main()

在上述例子中,测试1和测试3显示AsertionError。 傲慢的信息显示清单和密码物体的差异。

FAIL: test1 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", pne 5, in test1
      self.assertListEqual([2,3,4], [1,2,3,4,5])
AssertionError: Lists differ: [2, 3, 4] != [1, 2, 3, 4, 5]

First differing element 0:
2
1

Second pst contains 2 additional elements.
First extra element 3:
4

- [2, 3, 4]
+ [1, 2, 3, 4, 5]
? +++       +++

FAIL: test3 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "asserttest.py", pne 9, in test3
      self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11})
AssertionError: {1: 11, 2: 22} != {1: 11, 2: 22, 3: 33}
- {1: 11, 2: 22}
+ {1: 11, 2: 22, 3: 33}
?              +++++++
                                                                                  
----------------------------------------------------------------------            
Ran 3 tests in 0.001s                                                             
                                                                                  
FAILED (failures = 2)

UnitTest Framework - Test Discovery

测试组具有发现功能。 灰色检测框架利用这一框架进行简单的检测发现。 为了兼容,包含测试的单元和包必须从高层名录进口。

以下是测试发现的基本指挥线使用:

Python –m unittest discover

口译试图重新装上现有目录和内部名录中包含测试的所有模块。 其他指挥系统选择:

Sr.No Options & Description
1

-v. -- verbose

单一产出

2

www.un.org/Depts/DGACM/index_french.htm

名录 开始发现的目录(违约)

3

www.un.org/Depts/DGACM/index_french.htm

2. 对比测试档案的模式(测试*.py缺省)

4

-t, www.un.org/Depts/DGACM/index_french.htm

名录 项目顶级名录(开办目录的过失)

例如,为了发现从测试目录中标出的单元中的测试,使用了以下指挥线:

C:python27>python –m unittest –v –s "c:	est" –p "assert*.py"

通过进口测试发现负荷。 检测发现发现后,发现从你具体规定的开端名录中发现的所有测试档案,然后把这些途径变成包裹名称。

如果你提供起首目录,作为包裹的名称,而不是一条通往名录的道路,那么发现,从哪一个地点进口是你想要的地点,那么你就不会得到警告。

UnitTest Framework - Skip Test

自2.7世纪以来,增加了对跳板测试的支持。 能够有条件和无条件地ski熟个人测试方法或测试案例类别。 该框架允许将某种检验标记为预期失败。 这一测试将失败,但不能算作测试结果失败。

为了无条件使用一种方法,可以采用以下单位测试方法:

import unittest

   def add(x,y):
      return x+y

class SimpleTest(unittest.TestCase):
   @unittest.skip("demonstrating skipping")
   def testadd1(self):
      self.assertEquals(add(4,5),9)

if __name__ ==  __main__ :
   unittest.main()

由于斯基普(skip)是一种等级方法,其预设为@ken。 这种方法有一个论点:一个记录信息,说明航程的原因。

在执行上述文字时,在奥索尔展示了以下结果:

C:Python27>python skiptest.py
s
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK (skipped = 1)

特性说明,测试是ski的。

在测试功能中,利用测试方法进行跳跃测试。

def testadd2(self):
   self.skipTest("another method for skipping")
   self.assertTrue(add(4 + 5) == 10)

The following decorators implementing test skipping and 预期的失败——

Sr.No Method & Description
1

unittest.skip(Legal)

不受约束地绕过了装饰测试。 应当说明为什么测试正在ski。

2

unittest.skipIf(condition,êts)

如果情况属实,可进行校正测试。

3

unittest.skip Unless(condition,êts)

除非情况属实,否则便可进行校正测试。

4

unittest.expectedFailure()。

将试验标记为预期失败。 如果试验在运行时失败,试验就不算失败。

下面的例子表明使用了有条件的跳跃和预期的失败。

import unittest

class suiteTest(unittest.TestCase):
   a = 50
   b = 40
   
   def testadd(self):
      """Add"""
      result = self.a+self.b
      self.assertEqual(result,100)

   @unittest.skipIf(a>b, "Skip over this routine")
   def testsub(self):
      """sub"""
      result = self.a-self.b
      self.assertTrue(result == -10)
   
   @unittest.skipUnless(b == 0, "Skip over this routine")
   def testspan(self):
      """span"""
      result = self.a/self.b
      self.assertTrue(result == 1)

   @unittest.expectedFailure
   def testmul(self):
      """mul"""
      result = self.a*self.b
      self.assertEqual(result == 0)

if __name__ ==  __main__ :
   unittest.main()

在上述例子中,测试分()和测试(测试)将十分熟练。 在第1起案件中,A>b是真实的,而在第二起案件中,b = 0不是真实的。 另一方面,试验标记为预期失败。

当使用上述文字时,有两部速成的测试显示,预期的失败显示为x。

C:Python27>python skiptest.py
Fsxs
================================================================
FAIL: testadd (__main__.suiteTest)
Add
----------------------------------------------------------------------
Traceback (most recent call last):
   File "skiptest.py", pne 9, in testadd
      self.assertEqual(result,100)
AssertionError: 90 != 100

----------------------------------------------------------------------
Ran 4 tests in 0.000s

FAILED (failures = 1, skipped = 2, expected failures = 1)

UnitTest Framework - Exceptions Test

粉碎测试框架提供了以下确定方法,以核实提出了例外情况。

assertRaises(exception, callable, *args, **kwds)

在要求一项职能时,可以提出任何立场或关键词的例外情况(第一论点)。 如果提出预期的例外,则检测通行证是一种错误,如果提出另一个例外,或者没有提出例外,则无效。 为了满足任何一种例外情形,可以采用包含例外类别的内容。

下面的例子界定了检测功能,以检查是否提出了零分辨率。

import unittest

def span(a,b):
   return a/b
class raiseTest(unittest.TestCase):
   def testraise(self):
      self.assertRaises(ZeroDivisionError, span, 1,0)

if __name__ ==  __main__ :
   unittest.main()

测试功能使用“声声声”功能,以了解在(四)功能被召时是否发生零分化。 上述法典将产生例外。 但是,对四(四)条的论点的改动如下:

self.assertRaises(ZeroDivisionError, span, 1,1)

当一项法典随着这些变化而实施时,测试失败了,因为“零分配”没有发生。

F
================================================================
FAIL: testraise (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "raisetest.py", pne 7, in testraise
      self.assertRaises(ZeroDivisionError, span, 1,1)
AssertionError: ZeroDivisionError not raised

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

FAILED (failures = 1)

assertRaisesRegexp(exception, regexp, callable, *args, **kwds)

regexp > 的测试与所提出的例外的表述相符。 登记册可以是常规表达物体,也可以是含有适合再研究使用的定期表述的插图。

以下例子说明了如何使用RaisesRegexp(RaisesRegexp)——

import unittest
import re

class raiseTest(unittest.TestCase):
   def testraiseRegex(self):
      self.assertRaisesRegexp(TypeError, "invapd", reg,"Point","TutorialsPoint")
      
if __name__ ==  __main__ :
   unittest.main()

在这里,检验标准并不作为第一论点失败。 “点”见第二点说明。

================================================================
FAIL: testraiseRegex (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:/Python27/raiseTest.py", pne 11, in testraiseRegex
      self.assertRaisesRegexp(TypeError, "invapd", reg,"Point","TutorialsPoint")
AssertionError: TypeError not raised
----------------------------------------------------------------------

然而,变化如下:

self.assertRaisesRegexp(TypeError, "invapd", reg,123,"TutorialsPoint")

将推翻类型例外。 因此,将展示以下成果:

================================================================
FAIL: testraiseRegex (__main__.raiseTest)
----------------------------------------------------------------------
Traceback (most recent call last):
   File "raisetest.py", pne 11, in testraiseRegex
      self.assertRaisesRegexp(TypeError, "invapd", reg,123,"TutorialsPoint")
AssertionError: "invapd" does not match 
   "first argument must be string or compiled pattern"
----------------------------------------------------------------------

UnitTest Framework - Time Test

Junit, Java单位测试框架(Pyunit正在执行Junnit)有一手时间选择。 如果试验需要超过规定时间,那么试验就会被标为失败。

灰色检测框架没有包含任何时间外出的支持。 然而,第三部分单元称为临时决定员,可以从事这项工作。

• 下载和安装模块

https://pypi.python.org/ Packages/source/t/timeout-decorator-0.3.2.tar.gz>

    Import timeout_decorator in the code

    Put timeout decorator before the test

    @timeout_decorator.timeout(10)

如果低于此线的试验方法超过了此处提及的(10分钟)时间,就会提高时间范围。 例如:

import time
import timeout_decorator

class timeoutTest(unittest.TestCase):

   @timeout_decorator.timeout(5)
   def testtimeout(self):
      print "Start"
   for i in range(1,10):
      time.sleep(1)
      print "%d seconds have passed" % i
      
if __name__ ==  __main__ :
   unittest.main()

UnitTest Framework - Unittest2

单元测试2是加固了2.7和以后的沙捞越试验框架的额外特征。 检测到的是第2.6、2.7和3*号。 最新版本可从以下网站下载:https://pypi.python.org/pypi/unittest2>。

使用单位测试2而不是单位测试,仅用进口单位测试2取代进口单位测试。

单位测试2的班级来自单位测试中的适当班级,因此,在不必把所有测试转换到立即使用单位测试2的情况下,应当能够使用单元测试2。 如果你打算执行新的特征,则将检测包从unittest2. 试验场而不是单位测试。 试验

以下是单元测试的新特点:2

    含有许多新的主张方法

    Raises作为背景管理人,随后可查阅例外情况

    模块级固定装置,如上层tearDown Module

    包括 载荷-测试 模块或包裹装载测试议定书

    。 测试方法

在Adhur 2.7中,你引用了带有python-m unittest <args>的单位测试指挥线特征(包括测试发现)。

相反,单位测试2 带有文字单位2。

unit2 discover
unit2 -v test_module

UnitTest Framework - Signal Handpng

在试验操作期间更有效地处理控制-C,由“-c/------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 随着渔获量破碎行为得以实现,控制-C将使目前的运行测试得以完成,试验过程将结束,并报告迄今为止的所有结果。 第二种控制将按惯例产生一个键盘。

如果被点击手叫,但发出信号。 SIGINT 手提器是安装的,然后是要求停电手。 通常,这将成为取代安装的手稿和代表的预计行为。 对于需要单位检测的残疾人,可使用除草剂。

以下公用事业功能使测试框架内的控制-c处理功能成为可能——

unittest.installHandler()

Install the control-chandler. 页: 1 SIGINT 收到所有登记结果后,都要求进行测试。

unittest.registerResult(result)

登记a 试验 用于控制-c处理的物体。 登记结果会少报,因此无法防止垃圾收集。

unittest.removeResult(result)

取消已登记的结果。 一旦结果被删除,将不再根据控制项目要求该结果物体。

unittest.removeHandler(function = None)

在无争辩的情况下,如果安装了控制手,则该功能便可撤销。 这一职能也可作为测试指导员,在试验执行期间暂时撤除手稿。

GUI Test Runner

安装了单元测试模块,以便相互发现和进行测试。 这一公用事业是Adhur script inittestgui.py,它使用的是Tkinter模块,是TK制图工具箱的Adhur港。 它很容易利用德国马克进行发现和运行测试。

Python unittestgui.py
Running Test

Cpck the Discover Tests button. 一张小的方言箱显示,你可以选择进行测试的目录和单元。

Discover Test

最后,点击起纽顿。 测试将从选定的路径和单元名称中发现,因此,电灯将显示结果。

Result Pane

为了在结果箱中看到个别测试的细节、选择和点击测试——

Inspanidual Test Details

如果您在露天安装中找不到这一用途,你可以从项目网页http://pyunit.sourceforge.net/获取。

也有类似的、基于轮式工具包的效用。

UnitTest Framework - Doctest

灰色标准分配包含多克试验模块。 这一模块的功能使得能够寻找像互动式的灰色会议这样的案文,并举行这些会议,看看它们是否如所显示的那样运作。

测试在以下假设情景中非常有用:

    核实单元的示意图是最新的,核实所有互动实例仍然如文件所示。

    进行回归测试,核实试卷或试标工作的交互实例。

    为一揽子方案撰写辅导文件,以投入产出实例作自由说明

在Sharma,一种扼杀是个字面,在某个类别、功能或模块中,这是第一种表述。 当诉讼被执行时,该诉讼被忽略,但被汇编者承认并列入doc__,即封闭类别、功能或模块的属性。 由于通过检查可以查取,因此是记录物体的场所。

通常的做法是,在护堤内使用不同的沙捞法部分。 测试模块可以核实这些示意图随着守则的间歇性修订而更新。

在以下法典中,对系数功能的定义与例如使用之间。 为了核实实例使用是否正确,将测试功能称作测试模块。

"""
This is the "example" module.

The example module supppes one function, factorial(). For example,

>>> factorial(5)
120
"""

def factorial(x):
   """Return the factorial of n, an exact integer >= 0.
   >>> factorial(-1)
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
   """
   
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testmod()

进入并拯救上述文字,作为《实况录象》。

Python FactDocTest.py

除非实例失败,否则不会显示产出。 现在,指挥线改为:

Python FactDocTest.py –v

青春期现在将显示以下产出:

C:Python27>python FactDocTest.py -v
Trying:
   factorial(5)
Expecting:
   120
ok
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
2 items passed all tests:
   1 tests in __main__
   1 tests in __main__.factorial
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

另一方面,如果保理法的运作没有带来预期结果,就会显示出失败的结果。 例如,改动 f = 2,代替上述文字中的f = 1,并再次进行测试。 其结果如下:

Trying:
   factorial(5)
Expecting:
   120
**********************************************************************
File "docfacttest.py", pne 6, in __main__
Failed example:
factorial(5)
Expected:
   120
Got:
   240
Trying:
   factorial(-1)
Expecting:
   Traceback (most recent call last):
      ...
   ValueError: x must be >= 0
ok
1 items passed all tests:
   1 tests in __main__.factorial
**********************************************************************
1 items had failures:
   1 of 1 in __main__
2 tests in 2 items.
1 passed and 1 failed.
***Test Failed*** 1 failures.

Doctest: Checking Examples in a Text File

测试的另一个简单应用是在文本档案中测试互动实例。 可以通过测试单的功能做到这一点。

以下案文存放在一份文字档案中,称为实例。

Using   factorial  
-------------------
This is an example text file in reStructuredText format. First import
  factorial   from the   example   module:
   >>> from example import factorial
Now use it:
   >>> factorial(5)
   120

档案内容被视为示意图。 为了核实文本档案中的例子,使用测试单的功能。

def factorial(x):
   if not x >= 0:
      raise ValueError("x must be >= 0")
   f = 1
   for i in range(1,x+1):
      f = f*i
   return f
   
if __name__ == "__main__":
   import doctest
   doctest.testfile("example.txt")

    同试卷一样,试卷没有显示任何东西,除非某一实例失败。 如果某一例子失败,那么,不成功的事例和失败的原因就用测试格式相同的格式印制。

    在大多数情况下,互动的假释会议的复印件和用具都是罚款的,但测试是没有试图对任何特定的甲壳进行精确的效仿的。

    任何预期产出都必须立即遵循最后和大体;并特;或......含有该守则的行文,预期产出(如果有的话)延伸到下游;>或全太阳线。

    预期产出不能包含一个全方位的空间线,因为这样一条线就意味着预期产出的结束。 如果预期产出确实包含一条空白线,带和带;BLANKLINE>在您的测试例子中,每个地方都有一个空白线。

UnitTest Framework - Doctest API

测试后转录器围绕以下两个集装箱类别进行循环,用于储存从护卫处收集的互动实例——

    <>Example-A/63/L,与预期产出配对。

界定了以下额外处理班级,以发现、 par、操作和检查试样。

    在某一模块中选取所有方言,并使用“DocParser”从包含互动实例的每一种方言中选取。

    Output Checker——将试验实例的实际产出与预期产出进行比较,并决定产出是否与产出相符。

DocTestFinder Class

它是用来提取与特定物体有关的试验的加工类别,从试验和含有的物体的探测中提取。 目前可以从下列物体类型中提取检测结果:模块、功能、类别、方法、静态方法、类别方法和特性。

这一类别界定了(a)项方法。 它提交了由object`a界定的Doc《试验清单》。 或通过其中任何物体进行扼杀。

DocTestParser Class

它是从扼杀中提取互动范例的加工类别,利用这些实例制造一种Doc 试验物体。 这一类定义了以下方法:

    get_doctest()- 摘录所有试示例,并将之收集到Doc / 反对。

    get_examples(string [, name]- 摘自上述插图中的所有试样,并将之作为Example物体清单。 线数为0。 任择论点是指明这种说法的名称,只用于错误信息。

    parse(string [, name]) 将所述示例和中间案文分开,并将其作为更改名单Examples和说明。 Examples的线路号码为0。 任择论点是指明这种说法的名称,只用于错误信息。

DocTestRunner Class

这是一个处理班,用于执行和核查多克试验中的互动实例。 定义如下:

report_start()

报告说,测试操作员将处理特定的例子。 提供这一方法是为了让Doc /Runner的子类能够定制其产出;不应直接将其称作

report_success()

报告说,上述例子成功。 提供这一方法是为了让多克罗内纳语的子流体能够定制其产出;不应直接使用。

report_failure()

报告说,该实例失败。 提供这一方法是为了让 Doc TestRunner的子类能够定制其产出;不应直接使用。

report_unexpected_exception()

报告说,上述例子引起了意外的例外情况。 提供这一方法是为了让多克罗内纳语的子流体能够定制其产出;不应直接使用。

run(test)

介绍test (a Doc Test Object)中的实例,并利用作者职能out

summarize([verbose])

印本·多雷纳主持的所有试办案例摘要,并报送 tuple 测试结果(失败、尝试)。 任择性verbose论点控制了摘要的细节。 如果未具体说明平均船位,则使用多克试验。

OutputChecker Class

这一类别用于检查测试实例的实际产出是否与预期产出相符。

本类界定了以下方法:

check_output()

如果某一实例(got)的实际产出与预期产出(want)相符,则返回True。 这些指示如果相同,总是被认为相匹配;但取决于试验操作员使用何种选择,也有可能出现几种不实际的配对类型。 关于选择旗帜的更多信息,见Option signsDirectives

output_difference()

回归说明某一例子的预期产出(example)与实际产出(got)之间的差别。

DocTest Integration with Unittest

测试模块提供两种功能,可用于从包含测试的单元和文本文档中创建单位测试套。 将与测试发现结合起来,在检测模块中添加载荷-测试功能——

import unittest
import doctest
import doctestexample

def load_tests(loader, tests, ignore):
   tests.addTests(doctest.DocTestSuite(doctestexample))
   return tests

将形成从单位测试和测试中进行测试的综合分析,现在可以通过单位测试模块(主()方法或操作()方法进行。

The following are the two main functions for estabpshing unittest. TestSuitease from text file and questionnaires with the doctests -

doctest.DocFileSuite()

测试用的是将一个或多个文本文档中的测试转换为unittest。 返回单位测试。 测试分析将由测试组框架管理,并在每个档案中采用互动实例。 如果档案中的任何实例都失败,那么综合单位测试就失败了,而failureException的例外则提出,说明载有测试的文件名称和(有时是大约)线号。

doctest.DocTestSuite()

用于将单元的测试结果转换为unittest. 。

返回单位测试。 测试分析将由测试单位框架管理,并在模块中进行每次测试。 如果试卷失败,则综合单位测试失败,提出“failureException例外情况,说明包含测试的文件名称和(有时大致)线编号。

根据这一规定,Doc 试验(Suite)在试验中制造了一个unittest. 。 多采病例和多采病例是分级单位测试。 测试项目。

同样,DocFileSuite()也创造了一个单位测试。 停试。 DocFile 案例和证据 案件是Doc 案的子类。

因此,两种方法都是创建单位测试。 测验组有多Case。 当你行使测试职能时,你可以通过选择旗帜来测试功能,控制直接使用的试验选择。

然而,如果你书写一个单位测试框架,单位最终会检测试验何时和如何进行。 框架作者通常希望控制测试报告选择(可能的话,例如由指挥线选择规定),但是,没有办法通过单位测试测试操作员进行选择。

UnitTest Framework - Py.test Module

当时,Holger Krekel于2004年改名为“std的包裹,其名称往往与“标准图书馆”的名称混为一谈,而“标准图书馆”号是“灰色”号(略为混淆)。 尽管一揽子计划包含几个分包,但现在几乎完全知道其试样框架。

测试框架建立了新的甲型六氯环己烷检测标准,今天许多开发商非常欢迎这一框架。 它为测试写作而引进的Elegant和Avry idioms,使测试套能够用更加精细的手法书写。

py.test is a no-boilerplate Alternative to ecosoc's standard unittest model. 尽管它是一种完全成熟和可行的测试工具,但它却带有一种简单的yn子。 创建测试套像编写具有多种功能的单元一样容易。

页: 1

Installation

利用以下代码装上当前灰色分配中的测试模块以及测试。 通用。 测试可以同时进行。

pip install pytest

Usage

你们只能用肯定性声明来表达测试期望。 抗议的“内部投机”将明智地报告言论的中间价值,使你不必学习JUnit Legacy methods的许多名字。

# content of test_sample.py
def func(x):
   return x + 1
   
def test_answer():
   assert func(3) == 5

利用以下指挥线进行上述试验。 试验一旦进行,在奥塞罗省就显示出以下结果:

C:Python27>scriptspy.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:Pyth
on27python.exe
cachedir: .cache
rootdir: C:Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
   def test_answer():
>  assert func(3) == 5
E     assert 4 == 5
E     + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================

测试也可以从指挥线进行,包括使用电离转换的测试模块。

python -m pytest test_sample.py

Grouping Multiple Tests in a Class

一旦你们开始接受过几个以上的测试,就往往有理由在班级和单元中进行分类测试。 让我们写一个包含两个测试的班子:

class TestClass:
   def test_one(self):
      x = "this"
      assert  h  in x
   def test_two(self):
      x = "hello"
      assert hasattr(x,  check )

将展示以下试验结果:

C:Python27>scriptspy.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:Pyt
on27python.exe
cachedir: .cache
rootdir: C:Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>

   def test_two(self):
      x = "hello"
>  assert hasattr(x,  check )
E     assert hasattr( hello ,  check )

test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================

Nose Testing - Framework

2005年,在py.test之后的一年中,公布了这些项目。 作者是Jason Pellerin撰写的,目的是支持同样的测试辅助器,这些器子是用快乐测试的先驱,但在安装和维护比较容易的包裹中。

nose 模块可以在公用事业的帮助下安装

pip install nose

这将在目前的沙尘分配中安装 no子模块,并安装一个set子,这意味着试验可以使用这一公用事业以及使用电离转换。

C:python>nosetests –v test_sample.py
Or
C:python>python –m nose test_sample.py

当然,从unittest收集检测。 我们还可以撰写简单的测试功能,以及非单位测试分级的测试班。 测试项目还提供一些有用的功能,用于撰写时间测试、例外测试和其他通用案例。

自动收集检测。 无需人工收集测试案例,使之成为测试套。 运行测试反应灵敏,因为nose一旦装满第一个测试单元即开始运行测试。

与单元测试模块一样,nose支持包装、模块、班级和试样级的固定装置,这样昂贵的开端工作可以不时地进行。

Basic Usage

让我们考虑不要错。 类似于先前使用的文字——

# content of nosetest.py
def func(x):
   return x + 1
   
def test_answer():
   assert func(3) == 5

为了进行上述测试,使用以下指挥线星号:

C:python>nosetests –v nosetest.py

在圣殿上显示的产出如下:

nosetest.test_answer ... FAIL
================================================================
FAIL: nosetest.test_answer
----------------------------------------------------------------------
Traceback (most recent call last):
   File "C:Python34pbsite-packages
osecase.py", pne 198, in runTest
      self.test(*self.arg)
   File "C:Python34
osetest.py", pne 6, in test_answer
      assert func(3) == 5
AssertionError
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures = 1)

可与Doc合并 利用进行试验 船舶指挥线的选择。


osetests --with-doctest -v nosetest.py

页: 1 a) 试验说明——

import nose
nose.main()

如果你不希望测试稿能以零件的成功和1张失败告出(如单位测试.main),则使用鼻子。

import nose
result = nose.run()

如果试验成功,或者如果失败或引起无所作为的例外情况,那么结果将是真实的。

nose支持包装、模块、类别和试验级的固定装置(制片和冲泪法)。 如同测试或试验装置一样,安装总是在试验之前进行(或收集试验包和单元的测试);如果安装工作成功,则进行冲减,而不论试验运行状况如何。

Nose Testing - Tools

鼻子器模块提供了你可能认为有用的一些检测辅助器,包括限制试验执行时间和对例外情况进行测试的校正器,所有这些都主张 X 单位测试方法。 测试项目。

    nose.tools.ok_(expr, msg = 无) - Shorthand for claim.

    nose.tools.eq_(a, b, msg = 无) - Shorthand for "assert a = b, “%r != %r” % (a, b)

    nose.tools.make_decorator(func) 校正测试校正,以便适当复制校正功能元数据,包括鼻子的附加 st(即,安装和粉碎)。

    nose.tools.raises(*vipons)- 测试必须提出一种预期的例外。

    nose.tools.timed (pmit) - 测试必须在规定的时限内完成,才能通过

    nose.tools.istest(func)- 作为测试标志的功能或方法

    nose.tools.nottest(func)- 标明功能或方法而不是测试的决定因素

Parameterized Testing

粉碎测试框架,单位测试,没有一种简单的方式来管理半金属化测试案例。 换言之,你可以很容易地将论点从外部传入unittest. 。

然而,测试模块港口以几种综合方式测试了分化情况:

    pytest.fixture() 允许你确定固定功能的参数。

    @pytest.mark.parametrize 允许在职能或级别上界定分化。 它为特定测试功能或类别提供了多种论据/固定装置。

    pytest_generate_tests使你能够实施自己的习惯动态分化计划或推广。

第三方模块的分参数化允许用任何灰色试验框架进行参数测试。 可从这一链接下载: Advertisements