zoukankan      html  css  js  c++  java
  • python+unittest在dos命令行加入参数运行用例

    在python里使用unittest写好用例后,想用一个批处理文件去双击即可运行,而且还想在批处理里面设置用例要传人的参数怎么办呢?

    下面是我的解决办法:

    1、在用例里面用sys.argv来设置

     

    # -*- coding: utf-8 -*-
    import json
    import unittest
    import time
    from appium import webdriver
    #from HtmlTestRunner import HTMLTestRunner
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.action_chains import ActionChains
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    
    startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    argv=sys.argv
    print(argv)
    if len(argv) >1 :
    
        waittime = argv[1]   #批处理输入参数1
        if len(argv) >2 :
            login=argv[2]
            print(type(login))
            login = json.loads(login)
            if len(argv) >3 :
                noReset=argv[3]
            else:
                noReset = True
        else:
            login = {
                "username": "xxxxxx",
                "userpwd": "xxxx",
                "newsever": "http://IP:port/agent_client"
            }
    else:
        waittime=5
    
    class LotteryTests(unittest.TestCase):
        def setUp(self):
            #初始化测试平台
            desired_caps = {
                'platformName': 'Android',      #移动操作平台
                'platformVersion': '4.4.2',  # 移动操作系统版本
                'newCommandTimeout': '3600',  # 自定义超时时间
                'deviceName': '127.0.0.1:52001',  # 设备名称
                'appPackage': 'com.dgcy.pasx',  # 测试APP的包名
                'app': 'E://example_android.apk',
                'appActivity': 'com.dgcy.ui.activity.StartTicketsActivity',  # 要从包中启动的Android活动的活动名称
                'automationName': 'Appium',  # 自动化引擎
                # 'unicodeKeyboard':True,
                # 'resetKeyboard':True,
                'noReset': noReset,
                'chromeOptions': {'androidProcess': 'com.dgcy.paysx'}
            }
            print(startime+': 打开APP...'.decode("utf-8"))
            self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
            time.sleep(5)
    
    
        def isElementExist(self, locator):
            """
            locator: locator输入规则:元素属性名=元素属性值,如果是id则以"id=xxx",如果是css则以“css=xxx”等,例如:id=com.dgcy.paysx:id/monitor_t;css=div.popup-content;
            xpath=//div[text()='删除成功'];name=myna;class=mmv;link=登录;
            :return: 布尔值
            """
            list=locator.split('=')
            flag = True
            driver = self.driver
    
            try:
                if list[0] == "id":
                    driver.find_element_by_id(list[1])
                elif list[0] == "xpath":
                    driver.find_element_by_xpath(list[1])
                elif list[0] == "name":
                    driver.find_element_by_namne(list[1])
                elif list[0] == "css":
                    driver.find_element_by_css_selector(list[1])
                elif list[0] == "class":
                    driver.find_element_by_class_name(list[1])
                elif list[0] == "tag":
                    driver.find_element_by_tag_name(list[1])
                elif list[0] == "link":
                    driver.find_element_by_link_text(u"%s" % list[1])
                return flag
            except:
                flag = False
                return flag
    
        def login(self): #打开app并判断是否自动登录
            print("Start test1...open application")
            time.sleep(2)
            #判断是否需要登录
            driver = self.driver
            assertelement=LotteryTests.isElementExist(self,"id=com.dgcy.paysx:id/monitor_t")
            if not assertelement:
                loging = driver.find_element_by_id("com.dgcy.paysx:id/login_submit").text
                try:
                    assert '登录'.decode("utf-8") in loging     #检测到登录按钮
                    print("检测到登录按钮,重新登录....".decode("utf-8"))
                    #输入用户名
                    driver.find_element_by_id("com.dgcy.paysx:id/loginUserName").send_keys(login["username"])
                    #输入密码
                    driver.find_element_by_id("com.dgcy.paysx:id/loginPwd").send_keys(login["userpwd"])
                    #输入服务器设置
                    driver.find_element_by_id("com.dgcy.paysx:id/fwurl").send_keys(login["newsever"])
                    time.sleep(1)
                    #点击登录
                    driver.find_element_by_id("com.dgcy.paysx:id/login_submit").click()
                except AssertionError as e:
                    print("未检测到登录按钮....".decode("utf-8"))
            else:
                print("已登录在APP首页".decode("utf-8"))
            time.sleep(2)
    
        def test_03_allTicket(self,timewait=waittime):
            # 检测‘运营监控’
            timewait=int(timewait)
            driver = self.driver
            assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t")
            if assertelement:
                firstPage = driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").text
                # 添加断言是否显示“运营监控”
                try:
                    assert '运营监控'.decode("utf-8") in firstPage
                    print("Login User is Right!")
                except AssertionError as e:
                    print('loginUser is Error')
                    self.login()  # 非‘运营监控’则重新登录
            else:
                self.login()
            driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").click()  # 点击运营监控
            WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/rb_all"))  # 等待显示所有数据
            print("正在每隔".decode("utf-8")+str(timewait)+"s循环获取到所有设备的状态.....".decode("utf-8"))
            driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click()  # 点击‘全部’
            while True:
                driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click()  # 点击‘全部’
                time.sleep(timewait)
                assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t")
                if assertelement == False:
                    raise ValueError("elm:(com.dgcy.paysx:id/monitor_t) is not exist!")
    
                #print("等待了"+str(timewait)+"s,获取到所有设备的状态.....")
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == '__main__':
        #构造测试套件
        
        unittest.main()

     

    2、写批处理文件test.bat

    ::后面的数字为等待时间,如果不输入则默认为5s,如果是需要输入用户名密码重新登录请把最后面的True改为False,最后一个参数如果是True或不填表示不需要输入用户名密码重新登录
    python C:Users用户名PycharmProjectsXAJKSX-lottery.py 10 {"username":"xxxxx","userpwd":"xxxxx","newsever":"http://ip:port/agent_client"} False
    pause

    3、还需要修改unittest里面的main.py文件

    因为unittest原本就没有想过要做批处理里加参数运行,所以要想成功必须得修改一下C:Python27Libunittestmain.py源码:

    在93行后面加入一下代码:

        if len(argv)>1:
                argv=argv[:1]

     修改完毕,运行自己编写的test.py,成功!

    晚生不才,请多指教!
  • 相关阅读:
    Spring(八)-spring5框架新功能
    Spring(七)-事务操作
    Spring(五)-AOP
    Linux errno错误码
    思考:如何保证服务稳定性?
    CPU性能分析工具原理
    Oracle数据库url格式
    java对象的四种引用:强引用、软引用、弱引用和虚引用
    给老板汇报技术规划的要点
    后端程序员必备:分布式事务基础篇
  • 原文地址:https://www.cnblogs.com/lkc-test/p/10287527.html
Copyright © 2011-2022 走看看