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