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