Appium python unittest pageobject如何实现加载多个case

  学习了Appium python项目施展的课程小伙伴都会有一个疑问,说现在所有的case都是通过一个suite进行一个方法一个方法进行添加的,但是在实际过程中我们不希望这样,我们做出来的功能是这样:

suite = unittest.TestSuite()
suite.addTest(CaseTest("test_02",parame=i))
unittest.TextTestRunner().run(suite)

  这个是我们现在做的现状,但是我们希望的是:

discover = unittest.defaultTestLoader.discover(case_dir,pattern=‘test_*.py‘)
unittest.TextTestRunner().run(discover)

  那我们如何才能够我们做出来的换成我们想要的呢?我这里告诉大家答案,你现在还不行!

  为什么这么说呢?首先我们需要知道一个前提,我们现在拿到的discover是什么?我们运行机制是什么?先看下面两个简单代码:

#coding=utf-8
import unittest

class StudyTest(unittest.TestCase):

    def test_study01(self):
        print("studytest de 01")
    def test_study02(self):
        print("studytest de 02")

  

#coding=utf-8
import unittest
class StudyTest01(unittest.TestCase):
    def test_study001(self):
        print("studytest01 de 001")

    def test_study002(self):
        print("studytest01 de 002")

if __name__ == ‘__main__‘:
    test_dit = ‘./‘
    discovre = unittest.defaultTestLoader.discover(test_dit,pattern=‘study_*.py‘)
    print(discovre)
    runner = unittest.TextTestRunner()
    runner.run(discovre)

  上面两个代码我们简单的实现了discover的实现,这里我们是不是想要的就是这样呢?但是为什么说不行呢?至少你现在不行,首先看一下我们打印的discover是什么。

<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[<case.study_test.StudyTest testMethod=test_study01>, <case.study_test.StudyTest testMethod=test_study02>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<case.study_test01.StudyTest01 testMethod=test_study001>, <case.study_test01.StudyTest01 testMethod=test_study002>]>]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[]>]>

  通过上面的打印我相信大家能够看出来,我把格式整理之后我们所谓的discover其实就是我们所有的case的一个集合(这里这么说不恰当,但是更容易理解),这里面是我们的用例,这个时候我只要去运行我们的case就可以了。那么问题来了,我们需要传递参数如何传递?是不是发现这样我们没办法传递参数?然后小伙伴们通过前面的课程发现了这样一个方法,课程中的方法我们讲到了

一个全局变量,但是这个我们需要一个方法一个方法添加,这不是我们的目的,所以我们可以通过查找在网上也能够找到方法,看一下代码:

#-*- coding: utf-8 -*-

#author: mushishi

#Date:2018年8月26日

import unittest

class ParametrizedTestCase(unittest.TestCase):

"""

继承之后,重写一下,把这个参数传递到unittest里面

"""

def __init__(self, methodName=‘runTest‘, param=None):

super(ParametrizedTestCase, self).__init__(methodName)

self.param = param

@staticmethod

def parametrize(testcase_klass, param=None):

testloader = unittest.TestLoader()

testnames = testloader.getTestCaseNames(testcase_klass)

suite = unittest.TestSuite()

for name in testnames:

suite.addTest(testcase_klass(name, param=param))

return suite

class TestOne(ParametrizedTestCase):

def test_first(self):

print (‘param =‘, self.param)

self.assertEqual(1, 1)

def test_two(self):

print (‘param =‘, self.param)

self.assertEqual(2, 2)

if __name__ == ‘__main__‘:

suite = unittest.TestSuite()

suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))

suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=2))

unittest.TextTestRunner(verbosity=2).run(suite)

通过上面这个方法是不是发现可以传递参数。但是可能很多小伙伴不知道什么意思,没事,我们仔细看一下代码的拆分,毕竟这个代码网上很多,但是很多小伙伴不知道为什么,而且很多小伙伴不知道这个怎么和我们的需求串联起来,也不知道和我们这个有什么关系,我们应该怎么处理。我们看下面:

    suite = unittest.TestSuite()
    suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))

首先我们看我们的程序执行入口,在我们这个入口我们知道我们有了一个容器,这个时候需要往容器里面添加case,这个case的添加我们是有条件的,我们首先需要知道这个case在哪一个class里面,也就是说我们添加我们case的时候是把class和方法一起添加的,那这个和我们上面说的通过拿到py文件,然后想参数话有啥关系?首先需要提出一个疑问:

  1、我们前面的代码只是拿到了我们所有的case,并没有拿到我们的class name,系统只是通过py文件去拿里面case然后添加到一个集合里

  2、我们后面知道的目前改进unittest框架的知识是需要class name的 这个我们好像也没办法操作

有这么两个疑问之后那么我们可以换一个思考方式,既然参数话目前掌握的知识我们只能够通过上面的参数话去操作,那么我们如何去更改自己的代码,然后又不要我们一个一个case的添加?

  其实通过上面的代码大家就已经发现了一个不一样的地方,我们这个不需要每个方法每个方法去添加,只需要有个class name 就行,那么我们这样能够把所有的case都运用到这个里面来吗?答案是肯定的。

我们只需要通过一个简单的转换就可以了。

仔细看上面的代码我们知道,参数话这个代码肯定是公共的,那我们就把这个抽出来作为一个公共的类:

#-*- coding: utf-8 -*-

#author: mushishi

#Date:2018年8月26日

import unittest  

class ParametrizedTestCase(unittest.TestCase):  

    """ 

     继承之后,重写一下,把这个参数传递到unittest里面

    """  

    def __init__(self, methodName=‘runTest‘, param=None):  

        super(ParametrizedTestCase, self).__init__(methodName)  

        self.param = param  

    @staticmethod  

    def parametrize(testcase_klass, param=None):  

        testloader = unittest.TestLoader()  

        testnames = testloader.getTestCaseNames(testcase_klass)  

        suite = unittest.TestSuite()  

        for name in testnames:  

            suite.addTest(testcase_klass(name, param=param))  

        return suite
#这个类我们单独抽离出来,我们就是用来把这个作为参数化的集中地

看到这里明白了么?其实我们只是需要把这个抽离出来,然后我们的case就变成了这样:

第一个case类:

#-*- coding: utf-8 -*-
#author: mushishi
#Date:2018年8月26日
from case.ParametrizedTestCase import ParametrizedTestCase
class Test01(ParametrizedTestCase):
    def test_01_case(self):
        print("这个是test01case里面的参数",self.param)
    def test_02_case(self):
        print("这个是test01case里面的参数",self.param)

第二个case类:

#-*- coding: utf-8 -*-

#author: mushishi

#Date:2018年8月26日
from case.ParametrizedTestCase import ParametrizedTestCase
import unittest
from case.pounittest_one import Test01
class TestOne(ParametrizedTestCase):  

    def test_first(self):  

        print (‘param =‘, self.param) 

        self.assertEqual(1, 1)  

    def test_two(self):

        print (‘param =‘, self.param)   

        self.assertEqual(2, 2)  

if __name__ == ‘__main__‘:

    suite = unittest.TestSuite()  

    suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=1))  

    suite.addTest(ParametrizedTestCase.parametrize(TestOne, param=2))
    suite.addTest(ParametrizedTestCase.parametrize(Test01,param=3))

    unittest.TextTestRunner(verbosity=2).run(suite)

这里我引入了两个case类,但是只是添加了这样的方法,是不是解决了呢?其实这样的方法网上很多,但是很多都需要思考怎么做。或者换一个思维。

原文地址:https://www.cnblogs.com/Mushishi_xu/p/9503078.html

时间: 2024-09-30 06:14:40

Appium python unittest pageobject如何实现加载多个case的相关文章

在Python的Django框架中加载模版的方法

在Python的Django框架中加载模版的方法 为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS =

Python PhatomJS 和Selenium动态加载页面 获取图片内容

随笔中的代码拷贝自 http://www.cnblogs.com/Albert-Lee/p/6275146.html 感谢阿里波特,通过学习自己做了一些注释,作为总结和记录. 1 from selenium import webdriver 2 import requests 3 from bs4 import BeautifulSoup 4 import os 5 import time 6 #定义函数时,尽量写上默认参数,字符='',数字=0,特殊对象也要定义默认值,这样就可以简单的通过.来

python数据分析之:数据加载,存储与文件格式

前面介绍了numpy和pandas的数据计算功能.但是这些数据都是我们自己手动输入构造的.如果不能将数据自动导入到python中,那么这些计算也没有什么意义.这一章将介绍数据如何加载以及存储. 首先来看读写文本格式的数据 pandas提供了一些用于将表格型数据读取为DataFrame对象的函数.如下表: csv文件是默认以,为分割符.可以通过命令行cat来读取文件内容. In [4]: cat /home/zhf/1.csv 1,2,3,4 5,6,7,8 9,10,11,12 同样的我们也可以

Python爬虫-05:Ajax加载的动态页面内容

1. 获取AJAX加载动态页面的内容 1.1. Introduction 如果所爬取的网址是通过Ajax方式加载的,就直接抓包,拿他后面传输数据的文件 有些网页内容使用AJAX加载,只要记得,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了. 拿到JSAON,就是拿到了网页的数据 例子:http://www.kfc.com.cn/kfccda/storelist/index.aspx 这里有很多页数据,每一页的数据都是ajax加载的.如果你直接用pyth

python 接口测试,测试用例的加载问题

1.加载单个测试用例:suite.addTest(order_delivery_doc('test_order_ready')) 2.加载整个测试用例类:suite.addTest(loader.loadTestsFromTestCase(TestRegister)) 原文地址:https://blog.51cto.com/7605937/2418080

appium+python+unittest+HTMLRunner编写UI自动化测试集

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 参考:https://juejin.im/post/5c3809a451882524c84ebabe 最终,得到App的信息如下: 1 appPackage:c

python unittest addCleanup中也加失败截图功能

在python web自动化测试中失败截图方法汇总一文中提到了失败截图的方法 但在实际测试中,如果我们的测试用例中加了addCleanups动作,如果addCleanups中动作失败了,就不会截图.那么该怎么做呢,解铃还得系铃人,还是得从addCleanups下手 思路: 我将在 addCleanup中再加一个截图的函数,但怎么判断用例是用例内失败还是addCleanup中失败呢,方法如下 我们在执行完用例后,看看self的属性,包括如下: (Pdb) print dir(self) ['__c

如何使用python运行一个webkit核心加载某个页面,从而监控到页面的所有请求?

主要是要执行页面里面的JS,并且可以监控到发送的HTTP请求. 就像chrome的network面板一样~ 因为是服务器跑,selenium之类的开打一个浏览器的不考虑~(而且它也不支持) 1638 次点击  ?  5 人收藏   取消收藏  Tweet  Weibo  忽略主题  感谢 页面 监控 请求5 回复  |  直到 2013-09-16 23:51:12 +08:00 Reply    1 dingyaguang117   2013-09-16 23:22:18 +08:00 如果有

python 加载外部文件

import sys import os def pySource(filePath): myFile=os.path.basename(filePath) dir=os.path.dirname(filePath) fileName=os.path.splitext(myFile)[0] if(os.path.exists(dir)): paths=sys.path pathfound=0 for path in paths: if(dir==path): pathfound=1 if not