今天又踩N多坑
1、我在testcase里头跑,
if __name__ =="__main__": pytest.main(xxxxx)
怎么跑都跑不出来allure报告,明明代码是一样的
最后我跑到了根目录或者说,pytest检测不知道我是一个testcase的目录下,跑相同代码,出来报告了
可能是与pycharm觉得我在单元测试,而非跑整个套件有关
2、中午碰到的坑。也是因为在刚学conftest,不太熟悉它
我想啊,让pytest跑完个用例之前,自己开启一个链接,driver;跑完后呢,自己再关闭 driver.quit() 掉
就这么个小小的愿望,把我折磨疯了。。
首先,我尝试了,pytest给的,setup teardown 但是不能传参数,setup倒还好,我启动不需要什么参数,teardown,我需要那个driver啊,没那driver我咋driver.quit()?
然后,我发现setup teardown 有个self的参数,OK,那我__init__ 里头,把这个driver传给self 不是美滋滋。。。。结果pytest不让测试用例有__init__,又走不通。
再之后,想办法,想到了conftest里头写fixture,,scope弄成 function级别的
找对路子了,我想写两个,一个before,一个after。。。。又回到了问题1,,,,,before不用参数,after需要driver,,,我不会传,,,我不知道怎么在conftest里头给fixture传参数
最后想到了yield
@pytest.fixture(scope="function") def getDriver(): driver = Driver.prepareForAndroidAppium() yield driver driver.quit()
就是想到了yield了,也很艰难,我想不通怎么回到yield上去。之前学习yield的时候,是将getDriver弄成迭代器,再次call它,就会回去。。。然而这边getDriver在testcase里头调用,直接成了个webdriver对象,
后来听高人一指点,才恍然大悟,我根本不用操心,它跑完自己就会回去。。。
3、把失败截图嵌入到allure报告里面去
在conftest里头修改钩子函数,让用例跑出来failed时候,进行截图操作
@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item):
outcome = yield
report = outcome.get_result()
if report.when == 'call':
if report.outcome == 'failed':
Driver.get_screenshot_as_file(item.funcargs['getDriver'], extra=item.funcargs["case"].testNo)
with allure.step("添加失败截图..."):
allure.attach(Driver.get_screenshot_as_png(item.funcargs['getDriver']), "失败截图", allure.attachment_type.PNG)
坑1:我自己封装的Driver库里头,get_screenshot_as_png 没有return出去,导致他要嵌进入byte object,而我是None Type(真是太傻了)
坑2:get_screenshot_as_file 这玩意,我捉摸好久,为啥本地的截图没出来。
结果是因为,它如果找不到目录,是不会自己创建目录的,也不报错,娇气的很。
以此做记录。