pytest今日小坑,失败截图插附在allure报告中

今天又踩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  这玩意,我捉摸好久,为啥本地的截图没出来。

结果是因为,它如果找不到目录,是不会自己创建目录的,也不报错,娇气的很。

以此做记录。

原文地址:https://www.cnblogs.com/july401/p/14110472.html