该部分记录如何获取预期结果-接口响应数据,分成两步:

1 获取数据源接口数据

2 提取后续页面对比中要用到的数据

并且为了便于后续调用,将接口相关的都封装到ProjectApi类中。

新建python包:apiclass 》 新建python file:api_fund。所有接口相关的操作均放到该文件中。隐去项目相关信息后的代码如下:

1 获取数据源接口数据

# coding:utf-8

import requests
from common.round_rewrite import round_rewrite #点击查看该函数 四舍五入
from common.jsonp_to_json import jsonp_to_json #点击查看该函数 jsonp转成json class Fund: fund_api_url = '接口地址url' """四个原始数据接口"""
def api_strategy(self,day=''):
"""
      接口1
"""
url = Fund.fund_api_url+'api1.json'
response = requests.get(url,params={"day":day}).json()
return response def api_lastestinfo(self,code):
"""
     接口2
"""
url = Fund.fund_api_url+'latestInfo/{0}.json'.format(code)
response = requests.get(url).json()
return response def api_trends(self,code,pattern,period):
"""
     接口3  
     """
identifier = "{code}_{pattern}_{period}".format(code=code,pattern=pattern,period=period)
url = Fund.fund_api_url+"trends/{0}.json".format(identifier)
jsonpstr = requests.get(url).text
jsonstr = jsonp_to_json(jsonpstr)
return jsonstr def api_timeline(self,code):
"""
     接口4
"""
url = Fund.fund_api_url+"timeline/{0}.json".format(code)
response = requests.get(url).json()
return response

2 提取后续页面对比中要用到的数据

 

接口1比较特别,返回数据是一个list,按时间升序排列。有的页面需要取最早的数据,有的页面取最新的数据。

1  用一个参数来标识,该参数设置成list切片步长。1从前往后去,-1从后往前取。

2 samples是一个dict组成的list,要取出每一个dict里的values

samples = sorted([list(ele.values()) for ele in samples]) # 转变成与页面数据一致的格式
def get_fund_strategy(self,code,day='',latest=1):
"""提取接口1的数据
latest:1-取最早的数据;-1-取最新的数据"""
fund_strategy = self.api_strategy(day) #获取策略配置接口数据,day之后的数据都会取出来 for ele in fund_strategy[::latest]: #1从前往后取最早,-1从后往前取最新
if ele["code"] == code:
self.code = ele["code"]
self.name = ele["name"]
self.summary = ele["summary"]
self.memo = ele["memo"]
samples = ele["samples"]
self.samples = sorted([list(ele.values()) for ele in samples]) # 转变成与页面数据一致的格式
return #取到则退出循环

接口2:一个页面只需要3M的数据,单独写了一个函数; 另一个页面需要全量数据。

    def get_fund_latestinfo(self,code):
"""提取接口2的数据"""
fund_lastestinfo = self.api_lastestinfo(code)
nav = fund_lastestinfo["nav"]
navDate = fund_lastestinfo["navDate"][-5:]
navChange = fund_lastestinfo["navChange"]
annualChangeAll = fund_lastestinfo["annualChangeAll"]
self.navlist = [nav,navDate,navChange,annualChangeAll]
percents = fund_lastestinfo["percents"]
self.percents_list = [list(ele.values())[1:] for ele in percents]

 def get_fund_percentM3(self,code):
"""获取3个月收益率,首页有该数据"""
fund_lastestinfo = self.api_lastestinfo(code)
self.percentM3 =fund_lastestinfo["percents"][0]["percentM3"]
return self.percentM3

接口3:需要对数值进行判断,当数值>=0,显示超出,否则跑输。

sharprun = "超出" if self.sharpeDiff >= 0 else "跑输"    

将列表里的每一个字典的key转成中文,方便与页面数据对比

self.trends = map(lambda line: {"日期":line["date"],"组合市值":line["mv"],"比较基准市值":line["bmv"]},trends) #列表里的字典key英文转成中文
def get_fund_trends(self,code,pattern,peroid):
"""提取接口3的数据"""
fund_trends = self.api_trends(code, pattern, peroid) # 请求接口数据
    
     """获取接口字段值"""
self.percent = fund_trends["percent"]
self.percentDiff = fund_trends["percentDiff"]
self.maxDown = fund_trends["maxDown"]
self.mdStart = fund_trends["mdStart"]
self.mdEnd = fund_trends["mdEnd"]
self.startDate = fund_trends["startDate"]
try:
self.sharpe = fund_trends["sharpe"]
self.sharpeDiff = fund_trends["sharpeDiff"]
sharprun = "超出" if self.sharpeDiff >= 0 else "跑输"
percentRun = "超出" if self.percentDiff >= 0 else "跑输"
sharpeDiff = abs(self.sharpeDiff)
except KeyError: # 夏普比率跨年时今年以来接口无数据,置为空
sharpe = sharpeDiff = sharprun = percentRun = "" trends = fund_trends["trends"] # 组合涨幅走势数据
self.trends = map(lambda line: {"日期":line["date"],"组合市值":line["mv"],"比较基准市值":line["bmv"]},trends) #列表里的字典key英文转成中文 result = [code,self.startDate, percentRun, abs(self.percentDiff), self.percent,
self.maxDown,sharprun, sharpeDiff, self.sharpe, self.mdStart, self.mdEnd] #与页面一样的格式
return result

接口4:需要取当前和昨天的值计算涨跌幅,并保留2位小数

 """提取原始接口中页面所需数据"""
def get_fund_timeline(self,code):
"""提取接口4的数据"""
fund_timeline = self.api_timeline(code) last = fund_timeline["last"]
date = fund_timeline["date"]
current = fund_timeline["current"]
timeline = fund_timeline["timeline"] rate = (current - last) / last * 100
timeline_current = dict(日期=date,实时估值=current,估值涨幅=round_rewrite(rate,2)) timeline_list = []
for tl in timeline: #分时数据
dt = tl["dt"]
nav = tl["nav"]
rt = (nav - last) / last * 100
timelinedata = dict(时间=dt,估值=nav,涨跌幅=round_rewrite(rt,2))
timeline_list.append(timelinedata)
return timeline_current,timeline_list

最后一部分,因页面图形无法自动化验证,手工测试相关的函数:

 def mannualtest_timeline(self):
"""分时图手工测试"""
print('code:00X00Y')
scode = input("获取实时估值 输入code")
try:
"""实时估值"""
current, timeline = self.get_fund_timeline(scode)
print("实时估值:", current)
print("分时图数据:")
for line in timeline:
print(line)
except Exception as e:
print(e)
 def mannualtest_trends(self):
"""走势图手工测试"""
print('code:00X00Y')
scode = input("获取组合走势图形数据:请输入code\n")
pattern = input("投资方式 W(默认) K\n")
peroiddict = {'': 'R1M', '': 'R3M', '': 'R6M','': 'R1Y', '': 'R3Y'}
peroid = input("投资期限输入对应数字 %s\n"%peroiddict) peroid = peroid.strip()
pattern = pattern.strip().upper()#去除左右空格后转大写 if pattern != 'K':
pattern = 'W'#只要不等于K,则默认W
if peroid in peroiddict.keys():
peroid = peroiddict[peroid] #在字典里则取对应值
else:
peroid = 'R1M' #不在字典取默认R1M try:
self.get_fund_trends(scode, pattern, peroid) #获取接口数据
print("组合走势图{scode}_{pattern}_{peroid}".format(scode=scode,pattern=pattern,peroid=peroid))
for line in self.trends:
print(line)
except Exception as e:
print(e)

the end!

python UI自动化实战记录二:请求接口数据并提取数据的更多相关文章

  1. python UI自动化实战记录一:测试需求与测试思路

    测试需求: 项目包含两个数据展示页面,数据均来自于四个数据源接口. 测试操作步骤: 选择5个大类型中的一个,每个大类型下有3个子类型,选择任一子类型,页面数据更新.需验证页面上的数据与数据源接口数据一 ...

  2. python UI自动化实战记录十一: 总结

    首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ...

  3. python UI自动化实战记录五:测试页面2 pageobject

    该部分记录测试页面2-StrategyPage,所有页面2上的元素定位.操作.获取属性等方法都写在该类中. 1 页面2继承自BasePage: 2 页面2第一部分写的是所有的定位器 3 页面2第二部分 ...

  4. python UI自动化实战记录七:页面2用例编写

    使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...

  5. python UI自动化实战记录六:页面1用例编写

    使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...

  6. python UI自动化实战记录三:pageobject-基类

    脚本思路: 使用pageobject模式,写一个basepage基类,所有页面的通用方法封装到基类中.比如打开页面,关闭页面,等待时间,鼠标移到元素上,获取单个元素,获取一组元素,获取元素的子元素,截 ...

  7. python UI自动化实战记录八:添加配置

    添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...

  8. python UI自动化实战记录四:测试页面1-pageobject

    该部分记录测试页面1-IndexPage,所有首页上的元素定位.操作.获取属性等方法都写在该类中. 1 首页类继承自BasePage 2 首页类第一部分写的是所有的定位器 3 首页类第二部分类的方法, ...

  9. python UI自动化实战记录十:执行测试及测试报告

    使用简单的unittest.TextTestRunner. 思路: 1 在report目录下创建当日测试报告目录 20190113 2 创建测试报告文件 f = 时间戳.txt 3 加载测试集,运行测 ...

随机推荐

  1. 【Python】txt数据处理

    实战场景 使用safe3wvs扫描,扫描完成后会在当前目录下生成一个日志文件spider.log,截图如下. 现要求将存在sql注入的url地址整理到spider_new.log文件中,下面分享一个自 ...

  2. x86的字节对齐与不对齐的问题

    比如这么一个结构体struct foo {short s;int   n;}; struct foo bar;假设bar的地址是0x12345670如果不按4字节对齐那么bar.n的地址就是0x123 ...

  3. linux 命令之重定向

    linux 重定向及部分命令 一,重定向讲解: 1> 标准输出重定向 覆盖原有内容 慎用!!!!!! 1>> 标准输出追加重定向 追加内容 2> 错误输出重定向 只输出错误信息 ...

  4. JS正则表达式一些基本使用、验证、匹配、正则匹配时一个变量

    js验证首位必须是字母 var str = "asfg"; /^[a-zA-Z].*/.test(str);//true是,false否 匹配所有空格 var str=" ...

  5. C++ Memory System Part2: 自定义new和delete

    在第一部分中,我们介绍了new / delete的具体用法和背后的实现细节,这次我们将构建我们自己的小型工具集,可以使用我们自定义的allocator类来创建任意类型的实例(或者实例数组),我们需要做 ...

  6. Visual Studio 安装OpenCV及问题总结

    1.VS安装OpenCV基本步骤 1)安装Visual Studio 下载网址https://opencv.org/releases.html# 2)安装OpenCV 下载网址https://www. ...

  7. 二、hadoop文件操作

    1.使用hadoop命令查看hdfs下文件 [root@localhost hadoop-2.7.2]# hadoop fs -ls hdfs://192.168.211.129:9000/  (最后 ...

  8. Js常用的设计模式(1)——单例模式

    <Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通 ...

  9. 使用ANY、Some或All关键字

    可以使用All或Any关键字修改引入子查询的比较运算符.Some是与Any等效的ISO标准,All要求Where表达式与子查询返回的每个值进行比较时都应满足比较条件,Any则要求Where表达式与子查 ...

  10. 正则表达式过滤联系方式,微信手机号QQ等

    有些输入不允许用户输入联系方式.可以使用以下正则表达式来判断是否输入敏感信息 var reg = new RegExp("(微信|QQ|qq|weixin|1[0-9]{10}|[a-zA- ...