• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

深度解析python自动化框架(unnitest+selenium+htmlreport)

python 搞代码 4年前 (2022-01-09) 33次浏览 已收录 0个评论

1.最基本的错误截图要能提供吧。

2.要是能提供出错页加载的接口信息该多好!(这个是我正在思考的问题)

3.如果可以的话,在自动化录制过程中,能全程录制,这样也利于跟踪bug(这个应该比较容易实现,毕业屏幕录制软件不少,可能需要一个脚本动态启动他们,结束关闭他们。)

在这里我顺便扯一句,可能有的公司认为自动化测试没什么价值,原因:自动化测试根本发现不了什么太多的bug。但是,我的想法是:

一、自动化测试核心不是发现多少bug,而是能确保你的项目主流程么有bug,能正常上线!如果自动化都能发现N个bug,手动人员都不需要测试的了!

二、.理论上讲自动化能覆盖所有手动测试的流程,但是你给自动化投入了多少,靠1到2个人?还更不上迭代的进度!

三、对于我们自动化人员自身而言,也要提高自己,你的价值一定不是只写写脚本,比如搭建环境的能力,搭建web框架的能力,开发桌面应用程序的能力,这些东西都能给手动测试提供便利,也是你的存在感最直接的体现!

回到正题吧,下面讲讲我的思路吧,我的想法如下:

1.因为测试的是流程,前面的test有问题后面的test我要跳过,执行也没有意思,但是报告中要体现!

2.如果出错我要能提供准确的截图。

3.我改写的unnitest要尽量方便,不要在写case上搞一堆的try….except,既不美观,也一直在写相同的代码。根据代码重构的思想,如果你一直在复制黏贴代码,你的代码一定是可以重构的!

我这里继承了unnitest.TestCase类,上篇随便我说过,unnitest就是TestCase的run方法与TestResult的游戏,那么我们就这样想,在执行run的时候如果判断为AssertError或者WebDriverException我们认为是fail,fail就自动截图(前提能拿到webdriver实例);如果是其他的错误我们认为是error。注意fail和error是不同的 ,fail一般是bug(除非你不小心写错代码,导致控件找不到),error是除了以上2中异常的错误,多半是运行错误不太可能是bug。多半是你自己的代码写法有问题。贴出代码如下:

#coding=utf-8import  unittestimport sysfrom  selenium.common import exceptionsfrom  selenium import webdriverclass SkipTest(Exception):    """    Raise this exception in a test to skip it.    Usually you can use TestCase.skipTest() or one of the skipping decorators    instead of raising this directly.    """    passclass _ExpectedFailure(Exception):    """    Raise this when a test is expected to fail.    This is an implementation detail.    """    def __init__(self, exc_info):        super(_ExpectedFailure, self).__init__()        self.exc_info = exc_infoclass IqunxingTest(unittest.TestCase):    __screenshot_path ="C:\screenshot"#拿不到截图路径默认路径    def run(self, result=None):        orig_result = result        if result is None:            result = self.defaultTestResult()            startTestRun = getattr(result, 'startTestRun', None)            if startTestRun is not None:                startTestRun()        self._resultForDoCleanups = result        screenshot_path=getattr(result,"screenshot_path",False)#尝试从result哪里拿到截图目录        if not screenshot_path:            screenshot_path=self.__screenshot_path        result.startTest(self)        testMethod = getattr(self, self._testMethodName)        if (getattr(self.__class__, "__unittest_skip__", False) or                getattr(testMethod, "__unittest_skip__", False)):            # If the class or method was skipped.            try:                skip_why = (getattr(self.__class__, '__unittest_skip_why__', '')                            or getattr(testMethod, '__unittest_skip_why__', ''))                self._addSkip(result, skip_why)            finally:                result.stopTest(self)            return        try:            success = False            try:                self.setUp()            except SkipTest as e:                self._addSkip(result, str(e))            except KeyboardInterrupt:                raise            except:                result.addError(self, sys.exc_info())#启动setUp失败直接判断出错            else:                try:                    testMethod()                except KeyboardInterrupt:                    raise                except (self.failureException,exceptions.WebDriverException):#如果是断言错误或WebDriverException,类型为fail,且增加截图                    #增加截图                    browser=self.getbrowser()#尝试拿浏览器实例                    if browser:                        filename=self.__class__<div>本文来源gaodai.ma#com搞##代!^码@网3</div>.__name__+"_"+self._testMethodName+".png"#格式:类名+方面名称                        browser.get_screenshot_as_file(screenshot_path+"\\"+filename)                        reback_filename=filename                    else:                        reback_filename=None                    result.addFailure(self, sys.exc_info(),reback_filename)#回传截图名称给report,以便能显示在报告中                except SkipTest as e:#如果为跳过的异常,类型为Skip异常                    self._addSkip(result, str(e))                except:#其他类型错误全部为error                    result.addError(self, sys.exc_info())                else:                    success = True                try:                    self.tearDown()                except KeyboardInterrupt:                    raise                except:                    result.addError(self, sys.exc_info())                    success = False            cleanUpSuccess = self.doCleanups()            success = success and cleanUpSuccess            if success:                result.addSuccess(self)        finally:            result.stopTest(self)            if orig_result is None:                stopTestRun = getattr(result, 'stopTestRun', None)                if stopTestRun is not None:                    stopTestRun()    def getbrowser(self):        #首先从类属性里面找webdriver实例        for value in self.__class__.__dict__.itervalues():            if isinstance(value,webdriver.Firefox):#如果value是webdriver.Firefox实例                return value        #再从实例属性里面找        for value in  self.__dict__.itervalues():            if isinstance(value, webdriver.Firefox):  # 如果value是webdriver.Firefox实例                return value        #实在找不到返回None        return None

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:深度解析python自动化框架(unnitest+selenium+htmlreport)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址