• appium-循环执行一条用例,失败时停止执行


    对于项目中一些难以复现的bug,手工操作比较耗时耗力,而且还不一定能够复现,如果知道操作步骤就可以用自动化来进行反复操作来复现该问题。

    1.了解该问题的操作步骤

    2.抓取日志

    3.遇到问题时,抓取截图

    4.复现问题后停止执行命令,并停止日志。

    首先想到的是使用monkey,可以通过自定义monkey来模拟操作步骤,由于能力有限,不知道monkey如何断言,并且如果一直运行logcat抓取日志,日志又太多,无法准确定位,所以想到使用appium.

    1.操作步骤,这里就不贴出了

    2.抓取日志 (这里进行了封装)

    class logcat:
       
    #开启adb命令
        def start_logcat(self, name):     
            data = time.strftime("%Y-%m-%d", time.localtime(time.time()))
            # path = "../../report/log/" + data
            dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
            path = os.path.join(dir, 'report/' + name)
    
            type = '.txt'
            now = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
            filename = ''
    
            if os.path.exists(path):
                filename = path + "\" + now + "_" + name + type
            else:
                os.makedirs(path)
                filename = path + "\" + now + "_" + name + type
            global logcat_file
            logcat_file = open(filename, 'w')
            logcmd = "adb logcat -v time"
            global poplog
            poplog = subprocess.Popen(logcmd, stdout=logcat_file, stderr=subprocess.PIPE)
    
    # 结束adb命令
        def stop_logcat(self):
            logcat_file.close()
            poplog.terminate()
    3. 遇到问题时截图
    def take_screenShot(driver,dir, name):
    
        day = time.strftime("%Y-%m-%d", time.localtime(time.time()))
        fq = "../../report/" + dir    # 上上级目录   ../上级目录   ./当前目录
        # dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
        # fq = os.path.join(dir, 'report/log/' + day)
        # fq =os.getcwd()[:-4] +'screenShots\'+day    根据获取的路径,然后截取路径保存到自己想存放的目录下
        tm = time.strftime("%Y-%m-%d_%H_%M_%S", time.localtime(time.time()))
        type = '.png'
        filename = ""
        if os.path.exists(fq):
            filename = fq + "\" + tm + "_" + name + type
        else:
            os.makedirs(fq)
            filename = fq + "\" + tm + "_" + name + type
        # c = os.getcwd()
        # r"\".join(c.split("\"))     #此2行注销实现的功能为将路径中的替换为\
        driver.get_screenshot_as_file(filename)
    
        print(name + "图片保存成功"

     4.循环该条用例

        def choose_case(self):
            for i in range(1, 10000):
                ClearAllTestReport()                             # 可能执行次数过多,这里每次都会清空日志
                print(u'', i, u'执行用例')
                testunit = unittest.TestSuite()
                testunit.addTest(multi_run("test_cash"))
                runner = unittest.TextTestRunner()
                result = runner.run(testunit)                    #得到执行的结果
                if not result.wasSuccessful():           # 如果执行结果为fail,停止执行
                    break

    项目实战

    class multi_run(unittest.TestCase):
    
        @classmethod
        def setUp(cls):
            configure = driver_configure.driver_configure()
            cls.driver = configure.get_driver()
            cls.assert_result = assert_result()
            cls.logcat = logcat()
    
    
        def test_cash(self):
            '''
            现金消费输入1
            '''
    
            name = ""
            dir = u"未返回给第三方"
            try:
    
                self.logcat.start_logcat(dir)
                # self.main = main_activity.main_activity(self.driver)
                # self.main.input_one()
                # time.sleep(1)
                # '''
                # 注意调用方式: 1. self.assert_result.assert_equals(*****)  assert_equals方法中的self不用传
                #             2. assert_result().assert_equals()  方法中的self不用传
                #             3. assert_result.assert_equals()  方法的self参数需要传入
                # '''
                name = u"银行卡"  # 添加name变量 在每一次断言
                # self.main.click_card()
                self.out_call = out_call(self.driver)
                self.lack_paper = lack_paper(self.driver)
                self.cash = cash_second(self.driver)
                self.out_call.click_consume()
    
                # self.out_call.long_touch(self.driver)
                self.order = self.out_call.get_order_no()
    
                self.out_call.click_card()
                gesture_manipulation().swipe_up(self.driver)
                self.out_call.click_btn_consume()
                time.sleep(2)
    
                # self.lack_paper.click_know()
                # self.lack_paper.click_know2()
    
                self.cash.click_complete()
                self.content = self.out_call.result_content()
                time.sleep(2)
                self.assertIsNotNone(self.content)
                # self.assertIsNone(self.content)
                self.out_call.back_activity()
                self.out_call.click_refund()
                time.sleep(1)
                self.out_call.delete_out_trade_no(self.driver)
                time.sleep(1)
                self.out_call.input_order_no(self.order)
                time.sleep(1)
                self.driver.tap([(644, 717), (685, 749)], 500)
                self.out_call.click_refund1()
                self.out_call.click_btn_finish()
    
                self.logcat.stop_logcat()  # 没有发生异常也要关闭日志
                # todo   ---------------           # 删除不需要的日志,也就是正常的日志
            except AssertionError as e:
                self.logcat.stop_logcat()  # 发生异常时关闭日志
                take_screenShot.take_screenShot(self.driver, dir, name)
                # self.out_call.kill_AppiumS()
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
    
    
    class for_case:
    
        def choose_case(self):
            for i in range(1, 10000):
                ClearAllTestReport()
                print(u'', i, u'执行用例')
                testunit = unittest.TestSuite()
                testunit.addTest(multi_run("test_cash"))
                runner = unittest.TextTestRunner()
                result = runner.run(testunit)
                if not result.wasSuccessful():
                    break
    
    if __name__ == "__main__":
        for_case().choose_case()
  • 相关阅读:
    Git中清除远程仓库HTTPS认证信息的方法
    JDK8新增时间类型用在JPA中的问题
    5 个关于 API 中日期和时间设计规则
    时间标准基础知识UTC和ISO8601
    JDK8中的时间API
    2019第7周日
    顶级思维模式:推导事物的第一性原理
    JS的jsoneditor,用来操作Json格式的界面;json-editor用来根据json数据生成界面
    Java读写文件,中文乱码解决
    intellij idea 热部署、热加载设置方法
  • 原文地址:https://www.cnblogs.com/jiablogs/p/10559305.html
Copyright © 2020-2023  润新知