Chuan's Blog

记录些工作上的心得


  • 首页

  • 关于

  • 归档

  • 标签

adb命令获取app端性能参数(Android)

发表于 2017-07-14
  • 最近在钻研手机端的专项测试,总结了一些内容;

    工具收集:

  • appcrawler:类似monkey的自动化遍历app爬虫工具
    github地址https://github.com/seveniruby/AppCrawler ;
    • 自动化探索性测试并获取加载时间和性能数据,需要借助一些工具
    • 支持ios和Android
    • 命令行执行
    • 支持自定义断言判断app是否崩溃
    • 支持阿里开源ui自动化框架macaca
    • 新老版本对比
  • leakcanary:Android的高效率发现大部分内存泄漏导致的OOM
    • 开源的,基于java语言,github地址https://github.com/square/leakcanary
      中文说明:https://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
      • 可在appcrawler集成
      • https://testerhome.com/topics/6022(在Jenkins上的实战帖)
  • MLeaksFinder:ios版自动内存泄漏检测工具
    • 开源的,基于object-c语言
      github地址 https://github.com/Zepo/MLeaksFinder
      中文说明:https://wereadteam.github.io/2016/07/20/MLeaksFinder2
    • 可在appcrawler集成
  • BlockCanaryEx:记录Android卡顿日志
    • 开源的,基于BlockCanary项目
      github地址 https://github.com/seiginonakama/BlockCanaryEx
      中文说明:
      https://github.com/seiginonakama/BlockCanaryEx/blob/master/README_ZH.md
    • 卡顿的时候侧重于关注app的代码,哪些方法耗时最多,重点记录和在ui显示出来
    • gc采样,卡顿的时候关注gc是否出现问题
    • 需要在app代码内注入
  • 腾讯gt:直接运行在手机,抓取性能参数
    • 支持ios(需要嵌入工程)和Android(由app和sdk组成,GT控制台可以独立安装使用,SDK需嵌入被调测的应用、并利用GT控制台进行信息展示和参数修改)
    • github地址:https://github.com/Tencent/GT
  • adb shell命令
    阅读全文 »

python-正确保留多位小数

发表于 2017-07-14 | 分类于 技术水文
  • python自带的float函数在保留两位小数的时候不够准确容易出现误差,而(‘%.2f’ % a)的方式是将数字转成了字符串类型,无法进行数字运算,所以这里我们将封装一个方法来实现正确的保留多位小数。

    阅读全文 »

通过python编码生成RobotFramework类

发表于 2017-06-01 | 分类于 技术水文
  • 在此记录下之前开发web版ride的过程中,遇到了python执行robot脚本的问题。

    直接创建TestSuit类

  • 通过python脚本生成Robot Framework 里面的TestSuite,并执行以下逻辑:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from robot.api import TestSuite
    ts = TestSuite('test')
    ts.resource.imports.library('Selenium2Library')
    ts.resource.imports.resource('d:/temp/flows.robot')
    tc = ts.tests.create('case')
    tc.keywords.create('Open Browser', args=[u'url=http://www.baidu.com', u'browser=gc'])
    tc.keywords.create('Go to', args=[u'url=http://tieba.baidu.com'])
    tc.keywords.create(u'\u5546\u54c1\u8be6\u60c5\u9875\u968f\u673a\u9009\u62e9\u5546\u54c1', args=[])
    ts.run()
阅读全文 »

利用locust和multi-mechanize 针对flask服务做压力测试

发表于 2017-05-31 | 分类于 技术水文

执行环境

  • centos7

Locust

  • 前面的帖子已经针对locust做了一个简单的介绍,这里将记录一下使用locust编写简单的压测脚本
  • 适用环境: python 2.7,python 3.3,3.4,3.5和3.6
  • 官网: http://docs.locust.io/
  • 所需库: locustio
    阅读全文 »

python-发送带图片的邮件

发表于 2017-05-02 | 分类于 技术水文

实现步骤

  • 设置邮件为多文本格式

    1
    MIMEMultipart('related')
    • 编写html格式内容包含图片信息

      1
      2
      msgHtmlImg = '<img src="cid:image{count}"><br>'
      MIMEText(msgHtmlImg, 'html')
    • 读取图片并添加邮件头

      1
      2
      3
      4
      5
      6
      7
      fp = open(imgpath, 'rb')
      msgImage = MIMEImage(fp.read())
      fp.close()
      # Define the image's ID as referenced above
      msgImage.add_header('Content-ID', '<image{count}>'.format(count=i))
      msgRoot.attach(msgImage)
阅读全文 »

celery在Django中的应用

发表于 2017-04-28 | 分类于 技术水文

celery介绍

  • Celery 是一个由 Python 编写的简单、灵活、可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具。
    Celery 专注于实时任务处理,支持任务调度。
    说白了,它是一个分布式队列的管理工具,我们可以用 Celery 提供的接口快速实现并管理一个分布式的任务队列。

关于celery的概念介绍

  • Brokers

    • brokers 中文意思为中间人,在这里就是指任务队列本身,Celery 扮演生产者和消费者的角色,brokers 就是生产者和消费者存放/拿取产品的地方(队列)
    • 常见的 brokers 有 rabbitmq、redis、Zookeeper 等
  • Result Stores / backend

    • 顾名思义就是结果储存的地方,队列中的任务运行完后的结果或者状态需要被任务发送者知道,那么就需要一个地方储存这些结果,就是 Result Stores 了
    • 常见的 backend 有 redis、Memcached 甚至常用的数据都可以。
  • Workers

    • 就是 Celery 中的工作者,类似与生产/消费模型中的消费者,其从队列中取出任务并执行
  • Tasks

    • 就是我们想在队列中进行的任务咯,一般由用户、触发器或其他操作将任务入队,然后交由 workers 进行处理。
      阅读全文 »

vim编辑器配置上的坑

发表于 2017-04-28 | 分类于 技术水文

【遇到的问题】

  • vim的配置被别人的误操作下修改或删除了”~/.vimrc” 配置文件,导致vim编辑器错乱,不可编辑,不可删除。

【解决办法】

  • 删除旧的”~/.vim”文件夹和”~/.vimrc” 文件;

    1
    2
    rm ~/.vimrc
    rm -Rf ~/.vim
  • 创建新的”~/.vim”文件夹和”~/.vimrc” 文件;

    1
    2
    mkdir ~/.vim
    touch ~/.vimrc
阅读全文 »

使用pt-query-digest分析mysql慢日志

发表于 2017-04-20 | 分类于 技术水文

工具介绍

  • pt系列(percona-toolkit)是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务。这些任务包括:
    • 检查master和slave数据的一致性
    • 有效地对记录进行归档
    • 查找重复的索引
    • 对服务器信息进行汇总
    • 分析来自日志和tcpdump的查询
    • 当系统出问题的时候收集重要的系统信息
  • pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog、General log、slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析。可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题进行优化。

安装

  • 安装percona-toolkit非常简单,到官网下载.tar.gz包:

    1
    2
    wget percona.com/get/percona-toolkit.tar.gz
    tar -zxvf percona-toolkit-2.2.20.tar.gz

    然后依次执行下面的命令:

    1
    2
    3
    4
    perl Makefile.PL
    make
    make test
    make install

    默认的会被安装在/usr/local/bin目录下。执行man percona-toolkit可以查看安装了哪些工具。
    如果安装过程中遇到错误有可能是因为缺少相应包,.pm包实际上perl的包,运行下面的命令安装即可:

    1
    yum install -y perl-Time-HiRes

    如果安装过程中出现” Error Downloading Packages”错误,尝试yum clean all后再安装。使用其Percona Toolkit中其他工具也可能会遇到类似的问题,按照提示安装相应的perl包就可以了。s

    如果单独安装pt-query-digest
  • pt-query-digest是一个perl脚本,只需下载并赋权即可执行。
    1
    2
    [root@test1 ]# wget percona.com/get/pt-query-digest
    [root@test1 ]# chmod u+x pt-query-digest
阅读全文 »

性能测试工具locust使用

发表于 2017-04-20 | 分类于 技术水文

部分内容转自https://my.oschina.net/u/1433482/blog/634047

什么是locustio?

  • Locust是易于使用、分布式的用户负载测试工具。用于网站(或其他系统)的负载测试,计算出系统可以处理并发用户数。
    测试时大量蝗虫会攻击你的网站。每只蝗虫(或叫测试用户)可以自定义、测试过程由web界面实时监控。这能帮助测试并确定瓶颈。
    Locust 完全基于的事件,单机可以支持数千用户。它不使用回调,而是基于轻量进程gevent, 能简单地实线各种场景。

特点

  • Python书写场景
    • 无需笨重的UI或XML。仅仅是代码,协程而不是回调。
  • 分布式,可扩展和,支持成千上万的用户
  • 基于Web的用户界面(基于flask)
    • Locust有整洁HTML + JS用户界面,实时展示测试细节,跨平台和易于扩展。
  • 可以测试任何系统
  • 可控制
    • 事件完全由gevent处理。

      背景

  • 我们研究了现有的解决方案,都不符合要求。比如Apache JMeter和Tsung。JMeter基于UI操作,容易上手,但基本上不具备编程能力。其次JMeter基于线程,要模拟数千用户几乎不可能。 Tsung基于Erlang,能模拟上千用户并易于扩展,但它它基于XML的DSL,描述场景能力弱,且需要大量的数据处理才知道测试结果。
    无论如何,我们试图解决创建蝗虫,当这些问题。希望以上都不是painpoints应该存在。
    我想你可以说我们真的只是想在这里从头开始自己的痒。我们希望其他人会发现,因为我们做的是有益的。
    阅读全文 »

【django】嵌入LDAP心得

发表于 2017-04-11 | 分类于 技术水文

涉及第三方库:

  • pyldap(如果部署在windows上需要用whl包来安装比较顺利,参考pyldap-2.4.28-cp35-cp35m-win_amd64.whl)
  • django-auth-ldap

修改setting文件

  • 需要导入2个库

    1
    2
    import ldap
    from django_auth_ldap.config import LDAPSearch
  • 添加配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LOGIN_URL = '/login.html'
    AUTHENTICATION_BACKENDS = (
    # 'django_auth_ldap.backend.LDAPBackend',
    'dashboard.myldapbackend.MYLDAPBackend',
    # 'django.contrib.auth.backends.ModelBackend',
    )
    AUTH_LDAP_SERVER_URI = 'ldap://127.0.0.1'
    AUTH_LDAP_BIND_DN = 'cn=Manager,dc=abc,dc=com'
    AUTH_LDAP_BIND_PASSWORD = "123456"
    AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=abc,dc=com", ldap.SCOPE_SUBTREE, "(cn=%(user)s)")
    AUTH_LDAP_ALWAYS_UPDATE_USER = False
阅读全文 »
12
wuzechuan

wuzechuan

19 日志
1 分类
13 标签
© 2017 wuzechuan