当前位置: 首页 > 工具软件 > Mox > 使用案例 >

python mox使用方法

邓开济
2023-12-01

  pymox是一套用于python代码unit test的框架. 官方链接如下:

  https://code.google.com/p/pymox/

  但是从官方的wiki上看到pymox的使用案例较少,而且比较简略. 


  这里按照通常使用情况整理下.


   首先从最基本的框架说起.

   创建一个unit test的test case, 在这里需要先import两个包

	import mox
	import unittest

  然后创建一个对应的测试类. 

class TestZoo(unittest.TestCase):
    def setUp(self):
        self.m = mox.Mox()

    def tearDown(self):
        self.m.UnsetStubs()

  现在设定被测程序存放于zoo.py, 提供函数如下:

from datetime import date

def get_most_popular_animal():
    month = get_month()
    if month in [11,12,1]:
        return 'penguin'
    elif month in [6,7,8]:
        return 'swan'
    else:
        return 'tiger'

def get_month():
    today = date.today()
    return today.month

def get_day():
    today = date.today()
    return today.day

  要测试函数get_most_popular_animal,需要先处理函数get_month,确保每次返回固定的数值。这里可以使用mox中的函数 StubOutWithMock.

    def test_get_most_popular_animal(self):
        self.m.StubOutWithMock(zoo, 'get_month')
        zoo.get_month().AndReturn(1)

        self.m.ReplayAll()
        self.assertEqual('penguin', zoo.get_most_popular_animal())
        self.m.VerifyAll()

  StubOutWithMock 用来指明哪个模块中的哪个函数需要被mock,后面通过AndReturn就可以指定函数的行为了。在调用被测函数之前,运行ReplayAll函数来生效这些mock。

  对于VerifyAll函数,其实在这里即使去掉这句话测试case也是可以通过的。

  如果我们对case稍加修改:

    def test_get_most_popular_animal(self):
        self.m.StubOutWithMock(zoo, 'get_month')
        zoo.get_month().AndReturn(1)
        self.m.StubOutWithMock(zoo, 'get_day')
        zoo.get_day().AndReturn(2)

        self.m.ReplayAll()
        self.assertEqual('penguin', zoo.get_most_popular_animal())
        self.m.VerifyAll()
  mock一个新的函数get_day,get_most_popular_animal其实并未调用此函数,于是运行时会得到下面的错误:
  ExpectedMethodCallsError: Verify: Expected methods never called:
    0.  get_day.__call__() -> 2

  所以可以通过VerifyAll()函数来检测哪些函数应该被执行到。



 类似资料: