分类 QA 下的文章

cd /usr/local

安装node js

wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-x64.tar.xz ###下载安装包
tar xf node-v10.15.0-linux-x64.tar.xz ###解压安装包
cd node-v10.15.0-linux-x64 ###删除多余的压缩安装包
ls node-v10.15.0-linux-x64/bin ###查看cpm和node文件
pwd ###查看cpm和node文件位置
ln -s /usr/local/node-v10.15.0-linux-x64/bin/node /usr/local/bin/node ###软连接
ln -s /usr/local/node-v10.15.0-linux-x64/bin/node /usr/local/bin/node ###软连接
npm run build ###查看npm命令是否OK
node -v ###查看npm安装版本
export PATH=$PATH:/usr/local/node-v10.15.0-linux-x64/bin. ###环境变量配置

备注:
mac环境变量配置文件 .bash_profile
linux 环境变量配置文件/etc/profile

android-sdk安装

wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz ###下载安装包
tar -zvxf android-sdk_r24.4.1-linux.tgz ###解压安装包
rm android-sdk_r24.4.1-linux.tgz ###删除多余的压缩安装包
若想删除已经解压的文件夹,使用命令 rm -rf examplefilename
vi /etc/profile ###进入环境变量配置文件,写入如下3条export命令
export ANDROID_HOME=/usr/local/android-sdk-linux ###配置环境变量
export PATH=$ANDROID_HOME/tools:$PATH ###配置环境变量
export PATH=$ANDROID_HOME/platform-tools:$PATH ###配置环境变量
android update sdk --no-ui ###更新sdk包
export ###查看配置的环境变量
cd $ANDROID_HOME ###查看$ANDROID_HOME配置的环境变量是否生效

安装appium

前提条件:需安装node js成功才可执行 npm 命令安装appium。
npm install -g appium ###通过npm全局安装appium,直接使用npm需使用梯子
执行npm命令后,同node js所在文件夹(如上为node-v10.15.0-linux-x64)位置:/usr/local/node-v10.15.0-linux-x64,会生成node_modules文件夹,位置:/usr/local/node_modules
所以:
cd /usr/local/node_modules ###可查看已安装的内容,如appium

appium-doctor安装(主要用于检查appium安装是否缺少东西)

npm install -g appium-doctor ###全局安装appium-doctor,直接使用npm一般需使用梯子,

⚠️注意:若未使用梯子时使用npm下载失败,可先安装淘宝的cnpm,再使用cnpm安装

`npm install -g cnpm` ###安装淘宝的cnpm
`cnpm install -g appium` ###cnpm全局安装appium

在公司转岗做测开了,估计2021年上半年的工作都在自动构建上面,下半年估计忙自动化测试脚本开发和维护。

大体上,由于公司项目都是安卓系统源码工程,自动构建选了Jenkins+Gerrit+SonarQube等开源工具来实现。

现在主要讲讲怎么搭建SonarQube服务器:

  • 首先准备一台Ubuntu服务器,建议直接购买刀片机,安全又稳定(预算有限直接上台台式主机也可以)。

1)下载一些文件:

2)先安装数据库PostgreSQL(这个是Sonar唯一支持的开源DB,MS-SQL&Oracle都是收费的),命令:

sudo apt install PostgreSQL

然后对数据库进行简单的配置:

  • 创建用户postgres,命令:

    sudo -i -u postres

  • 输入以下命令进入交互界面:

    psql -u postres

  • 在交互界面输入以下命令修改默认密码:

    alter user postres with password '你的数据库账户密码';

  • 继续输入以下命令创建数据库:

    CREATE DATABASE sonar;

  • 输入以下命令退出设置:

    q

  • 输入exit退出postres账户
  • 将数据库信息写入到sonar的配置文件 $SONARQUBE-HOME/conf/sonar.properties:

    sonar.jdbc.username=postgres
    sonar.jdbc.password=你的密码
    sonar.jdbc.url=jdbc:postgresql://localhost/sonar

3)配置JDK路径到sonar配置文件$SONARQUBE-HOME/conf/wrapper.conf ,将以下行改为:
wrapper.java.command=你的JDK11绝对路径

4)把下载的CXX检查的jar包放入$SONARQUBE-HOME/extensions/plugins下

5)使用$SONARQUBE-HOME/bin/linux-x86-64/sonar.sh start启动sonar服务器, 出现以下字样代表启动成功(不能使用root权限启动):

Starting SonarQube...
SonarQube is already running.

6)浏览器输入 ip:9000 ,就可以看到sonar的主页了。

默认账户/密码:admin/admin

7)安装简体中文包:

① 点击顶部菜单,最后一个配置,
② 点击子菜单“应用市场”,
③ 在插件搜索框中输入“chinese”,安装简体中文插件

一些问题解决方法:
1、启动的时候遇到 Process exited with exit value [es]: 143报错:
解决方法:
在/etc/sysctl.conf文件中加入
vm.max_map_count=262144
fs.file-max=65536
然后执行sysctl -p使配置生效

在 /etc/security/limits.conf后加入
ulimit -n 65536
ulimit -u 2048
然后切换sonar用户下执行ulimit -Hn

$SONARQUBE-HOME/bin/linux-x86-64/sonar.sh restart 重启
2、启动的时候遇到 Process exited with exit value [es]: 1报错:
解决方法:
以普通权限运行,不要以root权限执行

最近要测试图片的显示质量,咨询了一些业内的大佬,提到了这样2个字眼:

  • PSNR:峰值信噪比
  • SSIM:结构相似性

最近要测试图片的显示质量,咨询了一些业内的大佬,提到了这样2个字眼:

  • PSNR:峰值信噪比
  • SSIM:结构相似性

公司的手机项目需要进行MTBF稳定性评估,此测试借鉴于中国移动入库的MTBF测试。得设计一款合适的自动化测试套件,遂有此文。

    1. 测试框架
    • 管理用例执行流程

      • setup(环境初始化)
      • do something(实际执行用例)
      • teardown (收尾工作)
    • 记录用例执行情况

      • 用例每个操作是否有对应记录
      • 单条用例测试结果
    • 记录手机日志

      • 单条用例测试日志
      • 详细日志分析
      1. 测试驱动
    • case开发人员使用python编写case,提供常见移动平台的测试api。
    • api风格类似于appium类似语法
    • 主要api分类:

      • 元素定位

        • by id
        • by name(text)
        • by class
        • by xpath
      • 动作执行

        • click
        • long press
        • drag
        • pinch
        • zoom
        • swipe
      • 结果断言

        • exist element

          • id
          • text
          • class
          • xpath
      • 辅助工具

        • shell cmd
        • dumpsys
        • performance data
        • logcat
        • log analyse
      1. 测试管理
    • 管理测试用例的执行
    • 收集测试数据,生成自定义测试报告
    • 测试机型管理,远程调试,报告展示

    今天早上搭建Jenkins的时候发现进tomcat管理界面返回403
    解决方法:
    打开webapps下的host-manager和manager,都有一个共同的文件夹META-INF,里面都有context.xml,这个文件的内容是:

    <Context antiResourceLocking="false" privileged="true" >
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             **allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"** />
    </Context>
    

    把allow这一行改成allow="0.0.0.0"即可,这个是允许所有ip访问,保存,重启tomcat即可。

    一直想读读appium的源码,传说这是目前移动UI自动化的新秀框架。想仔细的了解,必须的去看看源码才能知道其中奥妙。

    0x00.这段时间做服务器接口测试,遇到一个需要动态获取校验码的,需要自己开发插件。

    0x01.准备基本的开发环境eclipse,下载jmeter源码,导入工程。下载地址:http://jmeter.apache.org/download_jmeter.cgi,请选择你使用的jmeter对应版本的源码。
    0x02.在src/functions下新建你自己的函数类
    0x03.开始码代码:

    package org.apache.jmeter.functions;
    
    import java.util.Collection;
    import java.util.LinkedList;
    import java.util.List;
    import org.apache.jmeter.engine.util.CompoundVariable;
    import org.apache.jmeter.samplers.SampleResult;
    import org.apache.jmeter.samplers.Sampler;
    
    public class {"函数名称"}extends AbstractFunction {
        
        //private static final Logger log = LoggingManager.getLoggerForClass();
        private static final List desc = new LinkedList();
        private static final String KEY = "__函数名称";
        private Object[] values = null;
    
        //Add arguments description
        static{
            desc.add("参数提示一");
            desc.add("参数提示二");
        }
        
        @Override
        public List getArgumentDesc() {
            // TODO Auto-generated method stub
            return desc;
        }
    
        @Override
        public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
            
            String numberString1 = ((CompoundVariable) values[0]).execute().trim();
            String numberString2 = ((CompoundVariable) values[1]).execute().trim();
            String 参数一;
            String 参数二;
            try{
                url = numberString1;
                isAuth = numberString2;
            } catch (Exception e){
                return null;
            }
    
            return String.valueOf(work(参数一,参数二));
        }
        
        public static void  print(String s){
            System.out.println(s);
        }
    
        private String work(String 参数一,String 参数二) {        
                
            String ret = null;
            //.....your code
            return ret;
        }
    
        @Override
        public void setParameters(Collection parameters) throws InvalidVariableException {
            //可以检查参数数量,主要包括以下两种方法
            checkMinParameterCount(parameters, 2);
            checkParameterCount(parameters, 2, 2);
            values = parameters.toArray();
            
        }
    
        @Override
        public String getReferenceKey() {
            //显示的函数名称
            return KEY;
        }
        
    }    
    

    上一章完成了FPS的命令行版本的查看工具,这一章节开始学习绘制FPS的曲线。

    在编写之前,谷歌了一圈,发现有一个叫mathplot的插件不错。开始读文档开战,插件官网地址:http://matplotlib.org/,看完demo,目标是能动态显示曲线。

    废话少说,贴代码:

    #coding:utf-8
    import os,time
    import matplotlib.pyplot as plt
    
    def checkadb():
    	return os.path.exists('adb')
    
    def checkdevices():
    	rt = os.popen('adb devices')
    	t = rt.readline()
    	rt.close()
    	return t
    
    def getframe():
    	cmd = "adb shell \"service call SurfaceFlinger 1013|busybox cut -d \( -f 2|busybox cut -d \\' -f 0 \""
    	r = os.popen(cmd)
    	text = r.read()
    	r.close()
    	return text
    
    def getfps():
    	starttime = round(time.time()*1000)
    	startframe = int(getframe(), 16)
    	time.sleep(0.001)
    	endtime = round(time.time()*1000)
    	endframe = int(getframe(),16)
    	fps = (endframe - startframe)*1000/(endtime - starttime)
    	return fps
    
    def draw():
    	plt.ion()
    	plt.xlabel("Time(s)")
    	plt.ylabel("FPS")
    	plt.title("FPS Test Tool For root android device v1.0 \n By Wanyor")
    	plt.xlim(0,60)  #首先得设置一个x轴的区间 这个是必须的
    	plt.ylim(0,100) # y轴区间 
    	m = []
    	x=0
    	while True:
    		x=x+1
    		if x>60:
    			plt.xlim(x-59,x)
    		m.append(getfps())  #存入list里面
    		plt.plot(m,label="$fps$",color="red",linewidth=1) #将list传入plot画图
    		plt.pause(0.0001) # 这个为停顿0.01s,能得到产生实时的
    
    def usage():
    	print 'Print fps realtime for a rooted android device.'
    	print ''
    	print 'Author: wangyong11@qiku.com 2016-6-15 17:38:43\n'	
    	print 'You can stop it use ctrl+c \n'
    
    
    def main():
    	#if checkadb():
    	usage()
    	try:
    		draw()
    	except Exception, e:
    		raise e
    	finally:
    		print "Buddy, android devices must root!!!"
    	'''
    	else:
    		print 'Please install adb toolkit!'
    	'''
    
    if __name__ == '__main__':
    	main()