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类,但是只是添加了这样的方法,是不是解决了呢?其实这样的方法网上很多,但是很多都需要思考怎么做。或者换一个思维。
Appium python unittest pageobject如何实现加载多个case的更多相关文章
- 转:从pickle看python类成员的动态加载和类的定位
		pickle是Python轻便的对象序列化工具.使用pickle可以方便地把python对象写入文件对象中,或者像soap那样在socket间传送. 按照python的一贯作风,类的成员在 ... 
- Python+Selenium爬取动态加载页面(2)
		注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ... 
- Python+Selenium爬取动态加载页面(1)
		注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ... 
- appium+python+unittest 测试用例的几种加载执行方式
		利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块: 一种是添加到testsuite集合中再加载所有的被测试对象,而testsu ... 
- appium+python+unittest+HTMLRunner登录自动化测试报告
		环境搭建 python3Java JDK.netFrameworknodejsandroid SDKappiumAppium-Python-Client(pip install Appium-Pyth ... 
- 利用python进行数据分析之数据加载存储与文件格式
		在开始学习之前,我们需要安装pandas模块.由于我安装的python的版本是2.7,故我们在https://pypi.python.org/pypi/pandas/0.16.2/#downloads ... 
- Python爬虫-05:Ajax加载的动态页面内容
		1. 获取AJAX加载动态页面的内容 1.1. Introduction 如果所爬取的网址是通过Ajax方式加载的,就直接抓包,拿他后面传输数据的文件 有些网页内容使用AJAX加载,只要记得,AJAX ... 
- python基础之 025 模块加载与import的使用
		内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ... 
- python爬虫之图片懒加载、selenium和phantomJS
		一.什么是图片懒加载 在网页中,常常需要用到图片,而图片需要消耗较大的流量.正常情况下,浏览器会解析整个HTML代码,然后从上到下依次加载<img src="xxx"> ... 
随机推荐
- [LeetCode] Single Number II 位运算
			Given an array of integers, every element appears three times except for one. Find that single one. ... 
- DNS解析过程详解【转】
			转自:http://blog.chinaunix.net/uid-28216282-id-3757849.html 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www. ... 
- final、finalize()、finally、static
			一.final final的三种情况: 1.变量 1)对于基本类型,final使数值恒定不变:而对于对象引用,final使引用恒定不变,即一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象, ... 
- php--获取用户ip
			一般在做登录的时候有的会要求同一个帐号不能同时用不同的ip登录,这个时候我们需要获取到用户IP地址 获取ip地址的函数: function getIP() { if (getenv('HTTP_CLI ... 
- ansible 2.7.1 快速开始
			refer to 官方手册 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html refer to 中文手册 ... 
- Akka之Actor生命周期
			我们首先来看一下官方给出的Actor的声明周期的图: 在上图中,Actor系统中的路径代表一个地方,其可能会被活着的Actor占据.最初路径都是空的.在调用actorOf()时,将会为指定的路径分配根 ... 
- mysql之count,max,min,sum,avg,celing,floor
			写在前面 昨天去青龙峡玩了一天,累的跟狗似的.不过还好,最终也算登到山顶了,也算来北京后征服的第三座山了.这里也唠叨一句,做开发这行,没事还是多运动运动,对自己还是很有好处的,废话少说,还是折腾折腾s ... 
- go --socket通讯(TCP服务端与客户端的实现)
			这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端.服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议.为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的 ... 
- mac 安装 gensim包出错
			安装时需要卸载scipy,结果显示 permission之类 加sudo也不行, 必须 得先disable 掉mac的SIP ,方法是重启系统 ,按住command+r ,进行recovers模式,然 ... 
- 简单便捷的纯PHP网盘程序 Veno File Manager 2.6.3(VFM2)
			体验过很多国外网盘程序,例如:Owncloud.Bedrive.YetiShare.XFilesharing.uCloud.Cloudshare 等等,诸如此类,VFM2与这些臃肿的商用或非商用来的程 ... 
