Nosetests试水思考

今天看了几分钟的nose用法,刚刚兴致勃勃地直接结合tempest来test的时候,用nosetests测试,说实话tempest也是扫了一眼,看到很多Test开头的,激情就来了,随手测试一个test_flavors.py,小case,验证通过,简单

出于好奇心,看看都验证了那些测试

首先看到以Test开头的,就明白是啥了,随便看一个,

    def test_create_flavor_with_int_id(self):
        flavor_id = data_utils.rand_int_id(start=1000)
        new_flavor_id = self._create_flavor(flavor_id)
        self.assertEqual(new_flavor_id, str(flavor_id))

看函数和变量名的意思就大概能明白,这个测试用例是为了测试预期的flavor id和经过_create_flavor处理后是否一致

这个成员方法

    def _create_flavor(self, flavor_id):
        # Create a flavor and ensure it is listed
        # This operation requires the user to have 'admin' role
        flavor_name = data_utils.rand_name(self.flavor_name_prefix)

        # Create the flavor
        flavor = self.client.create_flavor(flavor_name,
                                           self.ram, self.vcpus,
                                           self.disk,
                                           flavor_id,
                                           ephemeral=self.ephemeral,
                                           swap=self.swap,
                                           rxtx=self.rxtx)
        self.addCleanup(self.flavor_clean_up, flavor['id'])
        self.assertEqual(flavor['name'], flavor_name)
        self.assertEqual(flavor['vcpus'], self.vcpus)
        self.assertEqual(flavor['disk'], self.disk)
        self.assertEqual(flavor['ram'], self.ram)
        self.assertEqual(flavor['swap'], self.swap)
        self.assertEqual(flavor['rxtx_factor'], self.rxtx)
        self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
                         self.ephemeral)
        self.assertEqual(flavor['os-flavor-access:is_public'], True)

        # Verify flavor is retrieved
        flavor = self.client.show_flavor(flavor['id'])
        self.assertEqual(flavor['name'], flavor_name)

        return flavor['id']

这里主要就调用了一个create_flavor函数,最终return的就是这个函数返回的关于键为id的value,也就是最终就是测试这个create_flavor执行的正确性,到了这里我理所当然地想象这个函数应该是创建flavor的api函数,目的肯定是测试开发的代码正确性,但是仔细看了看也不对呀,import的模块都好像是tempest这个测试框架里的内容,而且这个函数的调用是self.client.create_flavor,好吧,我承认,所有的client.py都被我找遍了,不知道是不是烟花了,还真没找到这个函数,最终在tempest/services/compute/json/flavors_client.py里才找到,看了看,函数内容应该没错

 54     def create_flavor(self, name, ram, vcpus, disk, flavor_id, **kwargs):
 55         """Creates a new flavor or instance type."""
 56         post_body = {
 57             'name': name,
 58             'ram': ram,
 59             'vcpus': vcpus,
 60             'disk': disk,
 61             'id': flavor_id,
 62         }
 63         if kwargs.get('ephemeral'):
 64             post_body['OS-FLV-EXT-DATA:ephemeral'] = kwargs.get('ephemeral')
 65         if kwargs.get('swap'):
 66             post_body['swap'] = kwargs.get('swap')
 67         if kwargs.get('rxtx'):
 68             post_body['rxtx_factor'] = kwargs.get('rxtx')
 69         if kwargs.get('is_public'):
 70             post_body['os-flavor-access:is_public'] = kwargs.get('is_public')
 71         post_body = json.dumps({'flavor': post_body})
 72         resp, body = self.post('flavors', post_body, self.headers)
 73 
 74         body = json.loads(body)
 75         return resp, body['flavor']  

说实话到这里,我有点凌乱了,这到底是测试啥,虽然现在我还不太清楚这个函数调用来自哪里,不过肯定的是tempest的框架和流程我没有弄清楚,以为拿着nosetests直接就上了,我考虑的主要是:

开发人员开发了代码,假如需要测试函数,或者其他东西,不应该直接源文件来进行修改编译,添加测试用例吧,我觉得肯定应该单独写自己的测试程序,然后将开发人员提供的输入输出糅合进去,最终来测试这段代码的功能是否正确

不过就我刚随便看了段这个函数,以及它的调用,感觉不太像是从开发的代码里面调用的,因为全部都属于tempest里,除非它从开发的源代码里copy了一份到这里面,不过说到这里,有一点我是很肯定的:tempest我还没明白是啥,希望熟悉一下之后上面的疑问能有答案

突然觉得应该备注一下:这些都来自刚github下载的,并非私密的~!

关于nosetests,来个小例子,我觉得应该是这种模式,如果不是说明我还没懂

源代码函数和类的实现

MacBook:~ lihui$ cat Fun.py
#!/usr/bin/env python

def fun():
    a = 1
    b = 2
    return (a, b)

class MyClass(object):
    def __init__(self):
        print '__init__'

    def foo(self, a):
        print 'foo'
        if a:
            return True
        else:
            return False

单独再来一个测试文件

MacBook:~ lihui$ cat Test_Fun.py
#!/usr/bin/env python

import Fun

def Test_fun():
    (a, b) = Fun.fun()
    assert a == b

def Test_MyClass():
    my = Fun.MyClass()
    assert my.foo(0)

最终通过执行这个Test脚本,达到检测源文件的目的

MacBook:~ lihui$ nosetests Test_Fun.py
FF
======================================================================
FAIL: Test_Fun.Test_fun
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/lihui/Test_Fun.py", line 7, in Test_fun
    assert a == b
AssertionError

======================================================================
FAIL: Test_Fun.Test_MyClass
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/lihui/Test_Fun.py", line 11, in Test_MyClass
    assert my.foo(0)
AssertionError: 
-------------------- >> begin captured stdout << ---------------------
__init__
foo

--------------------- >> end captured stdout << ----------------------

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=2)
MacBook:~ lihui$ 

发表评论