今天看了几分钟的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$