ylib测试用例指引

写1小时测试用例,省10小时debug

路径

  • 在package中的testcase中出现的所有路径参数都是相对路径.确保我可以跑通测试用例
  • 为了避免各种import的路径问题.负责人在pyCharm中打开ylib目录,然后运行里面的测试用例,测试用例通过了可以通知我.
  • 针对特殊值的测试(称为鲁棒性检测).例如下面的代码。 这类测试可以命名为test_robust_<名词>.
[],{}, pd.DataFrame(), None
  • 测试用例要考虑处理网路请求无返回等情况.可以通过自己定义模拟函数的方式来实现
# 需要现在原先的代码中把对于网络请求的依赖使用RequestBhv实例隔离出来.
class RequestBhv
    def mockrequest(method,url):
        raise TimeOutError # 外部调用的时候会直接报这个错误
  • 需要函数有正确报错的行为.可以参考下面的代码
def test_convert_rel_path():
    is_error = False
    try:
        convert_rel_path(rel_to="yeascript")
    except:
        is_error = True
    assert is_error

自动执行

  • 测试用例都要有assert 语句来检查结果是否符合预期.未来可以全自动跑测试用例.参考下面的重构:
ftp_behavior = FtpBhv()
ftp_behavior.io_login()
print(ftp_behavior.is_dir_exist(r'\test\sidyph'))
ftp_behavior = FtpBhv()
ftp_behavior.io_login()
the_path = r'\test\sidyph'
try:
    ftp_behavior.remove(the_path)
except e:
    pass
assert ftp_behavior.is_dir_exist(the_path) == False # 这个assert替代了之前使用人肉看print结果
  • assert 要判断具体的值,而不是仅仅检查类型.参考下面的代码:
def test_get_py_code_frm(self):
        py_coding_frm = self.get_code_report.get_py_code_frm(self.py_file_path)
        assert isinstance(py_coding_frm, pd.DataFrame) # 仅仅判断类型是不够的
        assert py_coding_frm['num'].tolist() == [999,123] # 需要判断具体值
        assert py_coding_frm['author'].tolist() == ['cc','cc'] # 需要判断具体值

可以使用print(DataFrame.tolist())把list形式的数据打印出来,然后复制粘贴到代码中.参考下图:

image.png

测试覆盖率

  • 一般每个类都有对应的一个测试用例.里面可以有多个assert.这个类的所有的外方的方法都会被执行到。所有的中间过程都要assert.例如下面的代码:
input = 1
step1 = Step1()
res1 = step1.do1(input)
assert res1 == 2 # 所有的中间过程都要assert.
res2 = step1.do2(res1)
assert res2 == 2
  • 如果某个方法存在3层(for-if-else), 必须检查里面的所有if-else是否正确.
  • 步骤类至少对应一个测试用例.
  • 每个测试用例都要有注释,写出这个测试用例检查的问题是什么.
def test_iostate_read():
"""测试iostate.read方法,在文件不存在的时候可以正常报错"""

建议写2个测试用例之后再实际开发

测试用例的模板如下.大家可以利用模板加速测试用例的撰写. 也可以采用.md文件的格式.

def test_code_frm():
    code_frm_step = CodeFrmStep() # 这个为待实现的class
    input = pd.DataFrame(data = [['hi', 'class'], ['para', 'return'], [3,2,1]])
    expected_res =  pd.DataFrame(data =  [[3],[5]])
    res = code_frm_step.do(input) # 这个为待实现的方法    
    assert_frm(res, expected_res )

运行时间一般不超过5秒

  • 除了以下特殊情况:
  1. 网络爬虫的测试用例可能需要超过5秒,此时需要记录完善的日志,方便检查问题.
  2. 要进行含有robust文字的用来做鲁棒测试的用例.

测试用例拆分

  • 如果是用了同一个input来测试的话,合并到一个测试函数去.除了下面的特殊情况:
  • 如果是检查同一个方法的各个执行分支的话,可以使用写testcase的方式,在set_up中把input写好,然后写test_main_case, test_corner_case等方法来测试各个分支.

使用test_readme.py取代README.md.

  • 这个测试用例文件需要把模块中所有涉及到的步骤类跑一遍.
  • 需要在本文件顶部写上注释:包括核心概念解释.说明类与类之间的依赖关系.
  • 所有的核心概念需要在本文件中的测试用例中出现
  • 中间结果都需要记录日志(就保存在tests文件夹中).这样方便以后他人用这里的测试用例来排查问题.
# test_readme.py
"""
[核心概念] code_line: 不含有import的代码行数
class_line: 以class开头的行数
"""
def test_all():
    step_1 = Step1()
    step_2 = Step2()
    res1 = step_1.do()
    io_state.wirte(".tests/readme_res1.frm")
    res2 = step_2.do(res1)
    io_state.wirte(".tests/readme_res2.frm")
    expected_res = pd.DataFrame(data= [[1,2]])
    assert_frm(res2, expected_res) 

2018-08-21新增

测试用例所在的文件夹需要设置写权限给code reviewer

否则无法跑通文件读写相关的测试用例.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容