#!/usr/bin/python
# -*- coding: utf-8 -*
# #############################################################################
#
# Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
#
# #############################################################################
"""
:author:
Guannan Ma maguannan @mythmgn
:create_date:
2014
:last_date:
2014
:descrition:
Null
"""
import sys
import traceback
import logging
import cup
__all__ = [
'assert_true',
'assert_false',
'assert_eq',
'assert_not_eq',
'assert_eq_one',
'assert_lt',
'assert_gt',
'assert_ge',
'assert_le',
'assert_ne',
'CUTCase',
'CCaseExecutor',
]
def _assert_bool(val, exp, errmsg=''):
if (val is not exp):
msg = 'got %s, expect %s\nUser ErrMsg: %s' % (val, exp, errmsg)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
[docs]def assert_true(val, errmsg=''):
"""
如果val is not True, assert并打印到stdout.
errmsg参数为assert后提示到stderr的调用者错误信息
如果开启过leo.log.init_comlog的log, 同时打印critical log到log文件
"""
if type(val) != bool:
raise ValueError('The type of val is not bool')
_assert_bool(val, True, errmsg)
[docs]def assert_false(val, errmsg=''):
"""
如果val is not False, assert并打印到stdout.
errmsg参数为assert后提示到stderr的调用者错误信息
如果开启过leo.log.init_comlog的log, 同时打印critical log到log文件
"""
if type(val) != bool:
raise ValueError('The type of val is not bool')
_assert_bool(val, False, errmsg)
[docs]def assert_eq(val, exp, errmsg=''):
"""
assert_eq, 如果val!=exp, assert并打印到stdout.
errmsg参数为assert后提示到stderr的调用者错误信息
如果开启过leo.log.init_comlog的log, 同时打印critical log到log文件
"""
if (val != exp):
msg = 'got %s, expect %s\nUser ErrMsg: %s' % (val, exp, errmsg)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
[docs]def assert_not_eq(val, exp, errmsg=''):
"""
assert_not_eq. val不能等于exp, 如果等于则assert
"""
if (val == exp):
msg = 'got %s which is equal, expect not equal \nUser ErrMsg: %s' % (
val, errmsg
)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
[docs]def assert_eq_one(val, array, errmsg=''):
"""
assert_eq_one, 如果val!=array(可遍历类型)里面的任何item, assert
"""
equal = False
str_arr = ''
for i in array:
str_arr += '|' + str(i) + '|'
if i == val:
equal = True
break
if not equal:
msg = 'got %s, expect one in the array: %s\nUser ErrMsg: %s' % (
val, str_arr, errmsg
)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
def assert_in(val, array, errmsg=''):
"""
同assert_eq_one, 如果val不在可遍历array里面, assert
"""
assert_eq_one(val, array, errmsg)
def assert_not_in(val, iteratables, errmsg=''):
"""
如果val不存在于iteratables中,则assert
"""
if val in iteratables:
assert False, 'val :%s in iteratables. ErrMsg:%s' % (val, errmsg)
[docs]def assert_lt(val, exp, errmsg=''):
"""
assert_lt, expect val < exp
"""
if val > exp:
msg = 'got %s, expect less than %s\nUser ErrMsg: %s' % (
val, exp, errmsg
)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
[docs]def assert_gt(val, exp, errmsg=''):
"""
assert_gt, expect val > exp
"""
if val <= exp:
msg = 'got %s, expect greater than %s\nUser ErrMsg: %s' % (
val, exp, errmsg
)
try:
cup.log.critical(msg, 1)
except Exception:
pass
assert False, msg
[docs]def assert_ge(val, exp, errmsg=''):
"""
expect val >= exp
"""
if val < exp:
msg = 'got %s, expect greater than (or equal to) %s\n User ErrMsg:%s'\
% (val, exp, errmsg)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False
[docs]def assert_le(val, exp, errmsg=''):
"""
expect val <= exp
"""
if val > exp:
msg = 'got %s, expect less than (or equal to) %s\nUser ErrMsg: %s' % (
val, exp, errmsg
)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, msg
[docs]def assert_ne(val, exp, errmsg=''):
"""
expect val != exp
"""
if val == exp:
msg = 'Expect non-equal, got two equal values %s:%s\nUser Errmsg: %s' \
% (val, exp, errmsg)
try:
cup.log.critical(msg, 1)
# pylint: disable=W0703
except Exception:
pass
assert False, errmsg
[docs]class CUTCase(object):
"""
leo库拥有的测试class. 支持nosetests. 可派生此类来实现测试class.
其中set_result函数会在nosetests执行case后设置,case成功则设置True,
case fail设置False. 在teardown阶段可调用get_result函数
来获得case是否执行成功。
"""
def __init__(self, logfile='./test.log', b_logstd=False, b_debug=False):
"""
:param logfile:
调用leo.log.init_comlog来进行log文件的初始化,case可直接调用
cup.log.[info|debug|critical|warn]来打印日志。
:param b_logstd:
是否打印日志到logfile的同时还打印stdout, 默认不打印
:param b_debug:
是否开启DEBUG Level的日志打印, 默认是INFO Level
"""
self._result = False
if b_debug:
debuglevel = logging.DEBUG
else:
debuglevel = logging.INFO
cup.log.init_comlog(
'test_case', debuglevel,
logfile, cup.log.ROTATION, 5242880, b_logstd
)
[docs] def setup(self):
"""
Case的setup虚函数, 实际case需事先该函数
"""
pass
[docs] def test_run(self):
"""
Case的setup虚函数, 实际case需事先该函数
"""
pass
[docs] def set_result(self, b_result):
"""
cup ut 类用来设置case是否失败的函数。 一般不需要显示调用,
内部自动处理。
"""
self._result = b_result
[docs] def get_result(self):
"""
在teardown或者fail_teardown阶段获得是否case执行成功
"""
return self._result
[docs] def teardown(self):
"""
Case的setup虚函数, 实际case需实现该函数
"""
pass
# def fail_teardown(self):
# """
# Case的setup虚函数, 实际case需实现该函数
# """
# pass
# pylint: disable=R0903
[docs]class CCaseExecutor(object):
"""
可调用CCaseExecutor类来执行leo.unittest.CUTCase的派生类case.
代码示例, 可nosetests执行, 也可python test_xxx.py执行的例子
::
#!/usr/bin/env python
import sys
import os
import logging
import cup
import sb_global
from nfsinit import CClearMan
from nfs import CNfs
from cli import CCli
class TestMyCase(cup.unittest.CUTCase):
def __init__(self):
super(self.__class__, self).__init__(
logfile=sb_global.G_CASE_RUN_LOG,
b_logstd=False
)
cup.log.info( 'Start to run ' + str(__file__ ) )
self._cli = CCli()
self._nfs = CNfs()
self._uniq_strman = cup.util.CGeneratorMan()
self._clearman = CClearMan()
def setup(self):
str_uniq = self._uniq_strman.get_uniqname()
self._workfolder = os.path.abspath(os.getcwd()) \
+ '/' + str_uniq
self._work_remote_folder = \
self._nfs.translate_path_into_remote_under_rw_folder(
str_uniq
)
os.mkdir(self._workfolder)
self._clearman.addfolder(self._workfolder)
def _check_filemd5(self, src, dst):
ret = os.system('/usr/bin/diff --brief %s %s' % (src, dst) )
cup.unittest.assert_eq( 0, ret )
def test_run(self):
#
# @author: maguannan
#
inited_bigfile = sb_global.G_NFS_DISK_RD + \
sb_global.G_TEST_BIGFILE
bigfile = self._workfolder + \
'/test_big_file_offsite_write_random_write'
self.tmpfile = sb_global.G_TMP4USE + \
'/test_big_file_offsite_write_random_write'
os.system( 'cp %s %s' % (inited_bigfile, bigfile) )
os.system( 'cp %s %s' % (bigfile, self.tmpfile) )
times = 50
baseOffsite = 1000
fp0 = open(bigfile, 'r+b')
fp1 = open(self.tmpfile, 'rb+')
for i in xrange( 0, times ):
fp0.seek(baseOffsite)
fp1.seek(baseOffsite)
fp0.write( 'a' * 100 )
fp1.write( 'a' * 100 )
baseOffsite += 1000
fp0.close()
fp1.close()
self._check_filemd5(bigfile, self.tmpfile)
def teardown(self):
if self.get_result():
# if case succeeded, do sth
os.unlink(self.tmpfile)
self._clearman.teardown()
else:
# if case failed, do sth else.
print 'failed'
cup.log.info( 'End running ' + str(__file__ ) )
if __name__ == '__main__':
cup.unittest.CCaseExecutor().runcase(TestMyCase())
"""
@classmethod
[docs] def runcase(cls, case):
"""
run the case
"""
failed = False
try:
case.setup()
case.test_run()
case.set_result(True)
# pylint: disable=W0703
except Exception:
print traceback.format_exc()
case.set_result(False)
failed = True
# case.teardown()
if failed:
try:
case.fail_teardown()
# pylint: disable=W0703
except Exception:
pass
print '========================'
print '======== Failed ========'
print '========================'
sys.exit(-1)
case.teardown()
print '========================'
print '======== Passed ========'
print '========================'
# vi:set tw=0 ts=4 sw=4 nowrap fdm=indent