Sparky


  • 首页

  • 归档

未命名

发表于 2019-05-06

测试相关杂记

概述

测试的好处:

  • 对故障的快速反馈
  • 开发周期中的故障检测
  • 更安全的代码重构
  • 稳定的发展速度

迭代开发工作流程

迭代开发工作流程

测试金子塔

测试金字塔

上图在展示了应用应该如何包含三种测试:

  • Small test 小测试一般指的是单元测试,指的是可以与生产环境分开进行的测试。这种方式通常可以模仿各个主要组件并且应该能够在你的设备上快速的运行
  • Medium test 中等测试一般指的是集成测试,指的是大型测试和小型测试之间的测试,它集成了多个组件并且可以在模拟器和真机上运行
  • Large test 大型测试是通过完成ui的工作流程运行的集成和ui测试,他们确保关键的最终用户任务在模拟器和真实设备上完成预期工作

由于每个测试类型的不同特征,您应该包括测试金字塔的每个层的测试。建议70% 小测试, 20% 中等测试, 10% 大型测试。

未命名

发表于 2019-05-06

FFMPEG编译流程

环境

  • Ubuntu-16.04
  • NDK-r15c
  • ffmpeg-2.6.9

编写shell脚本

#!/bin/bash
make clean
export NDK=/home/wuhuannan/Android/Sdk/ndk-bundle
export SYSROOT=$NDK/platforms/android-14/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

修改config文件

 #注释的部分
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

#自己写的部分
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

给脚本设置权限,并运行脚本

未命名

发表于 2019-05-06

virturebox无法与宿主机相互复制粘贴

  1. 虚拟机->设备->共享粘贴板->双向
  2. 虚拟机->设备->拖动->双向
  3. 虚拟机->设备->程序增强功能,打开我的电脑,安装增强功能

未命名

发表于 2019-05-06

xml parser

xml pull解析和sax解析的主要区别

sax解析的工作方式是自动将事件推入注册的是事件处理器进行处理,不能控制事件的主动结束。

pull解析的主要工作方式允许你的应用程序主动从解析器获取事件。

android.util.Xml提供了这两种解析方式。

未命名

发表于 2019-05-06

virtualbox没有可用设备(不能识别usb)

记一次小坑,修改东西的时候要多想想有什么后果,不然以后遇到坑的时候根本无从下手。

在学linux用户管理的时候手贱改了一下主用户的用户组,当时也没想那么多,也忘记安装virtualbox及设置vm usb设备时添加用户组的操作,这次也是过了很久才又来刷系统,导致出现这个问题的时候一脸懵逼。

1 sudo usermod -a -G vboxusers $(USER_NAME)
2 shutdown -r now

未命名

发表于 2019-05-06

sed和awk

  1. sed是什么?sed是一个非交互文本编辑器。可以对文本文件和标准输入进行编辑。 stream editor
  2. sed的使用方式。

    1. 命令行方式
        格式为:
        sed [选项] [sed命令] [输入文件]
    2. 将sed命令插入脚本文件后,通过sed命令调用
        sed [选项] -f [sed脚本文件] [输入文件]
    3. 将sed命令插入脚本文件后,设置为可执行文件,直接执行
        ./[脚本文件] [输入文件]
    
    > 如果没有输入文件,将从标准输入中接受输入
    
  3. 常见的选项

    -n 不打印所有行到标准输出
    -e 表示下一个字符串将被解析为sed命令,如果只有一个,-e可以省略
    -f 表示正在调用sed脚本文件
    
  4. sed命令

    sed命令通常由定位文本行和sed编辑命令两部分组成。
    
    sed定位文本的方法:
    x x为指定行号
    x,y 指定从x到y的行号范围
    /pattern/ 查询包括模式的行
    /pattern1/pattern2/ 查询包括两个模式的行
    /pattern/,x 从与pattern的匹配行到x行之间的行 
    x,/pattern/ 从x到与pattern的匹配行之间的行
    x,y! 查询不包括x,y行号的行
    
    sed编辑命令:
    p 打印匹配行
    = 打印匹配行号
    a\ 在定位行号之后添加文本信息
    i\ 在定位行号之前加入文本信息
    d 删除定位行号
    c\ 用新文本替换定位文本
    s 使用替换模式替换相应模式
    r 
    

未命名

发表于 2019-05-06

UI Automator

根据google的文档,Espresso主要用于单个应用的ui测试。UI Automator主要用于多个应用的ui测试。

允许让您在用户流跨越其他应用程序或者系统UI时验证您的应用程序是否正常运行。比如,一个即时通信的app,它允许用户打开联系人并选择要发送消息的人,然后返回app,并发送消息。

UI Automator允许您与设备上的可见元素进行交互,无论哪个Activity的位于前台,它都可以使用方便的描述符来查找UI组件。

使用UI Automator

设置依赖

需要在build.gradle中配置依赖

dependencies {
    ...
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
}

检测应用程序的UI组件

Android sdk自带的uiautomatorview工具提供了方便的可视界面,用于检查布局层次并查看当前可见的ui属性。这些信息允许您使用UI Automator创建更细微的测试。

启动uiautomatorview工具:

  1. 打开目标应用程序
  2. 将设备连接到计算机
  3. 打开终端窗口并进入/tools/目录
  4. 执行以下命令

    $ uiautomatorviewer
    

查看ui属性:

  1. 在uiautomatorviewer界面,点击”Device Screenshot”按钮
  2. 将鼠标悬停在左侧面板的快照上即可查看该uiautomatorviewer工具识别的UI组件。属性位于右下方面板,布局层次结构位于右上方面板。
  3. 在右上方布局层次结构上方,点击”Toogle NAF nodes”按钮可以查看UI AutomatorViewer无法识别的ui组件。

确保Activity可以访问

UI Automator测试在已经实现了Android辅助功能的应用程序上表现更好。

当使用sdk中包含的view类或这view的子类的时候不用再添加辅助功能,因为这些类已经包含了这些工作。

但是如果要使用自定义的view的时候,这些元素不会提供可访问性支持,所以你要通过以下的步骤添加Android辅助功能。

  1. 创建一个类extends ExploreByTouchHelper.
  2. 通过调用将新类的实例与自定义view关联。

创建UI Automator测试类

UI Automator测试类和junit 4的测试类的方法一样。

主要是需要在@Test中实现一下编程模型:

  1. 获取到UiDevice对象,通过调用getInstance()并且需要传递Instrumentation对象作为参数
  2. 通过findObject()方法获取当前设备显示的UiObject对象去访问ui组件
  3. 通过调用UIObject的方法来执行交互,例如模拟多点触控手势,以及编辑文本字段。
  4. 查看是否达到了预期的状态和行为

指定选择器

如果要访问应用程序中特定的UI组件,请使用UiSelector类。

如果找到了多个匹配元素,则返回匹配元素的第一个元素作为UiObject。构建是可以使用链式编程以优化搜索。如果没有找到匹配元素会抛出异常。

可以使用childSelector去匹配子view

执行UI操作

一旦你获取到UiObject对象,你就可以对该对象执行UI操作。

  • click()
  • dragTo()
  • setText()
  • swipeUp()
  • swipeRight()
Context context = getInstrumentation().getTargetContext();
      Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.xxx");
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
      context.startActivity(intent);

      device.wait(Until.hasObject(By.pkg("com.xxx").depth(0)), 2000);

对viewgroup进行操作

可以使用UiCollection去获取viewgroup。

对可滑动view进行操作

可以使用UiScrollable类去获取可滑动views

验证结果

你可以使用JUnit的Assert方法测试ui组件的结果是否是预期的结果。

run

与JUnit测试运行方法相同

未命名

发表于 2019-05-06

1. 入门

RxJava是一个在JVM上使用可观测序列来组成异步的,基于事件的程序的库。

我们可以把它和Handler、AyncTask归为一类,都是用来处理异步事件的库。

它的特点是:

  1. 逻辑简洁
  2. 使用简单
  3. 实现优雅

2. 原理解析

被观察者通过订阅产生一系列事件,观察者按顺序接收事件并按顺序做出反应。

3. 基础使用

步骤:

  1. 创建被观察者(Observerable)
  2. 创建观察者(Observer)
  3. 通过订阅(subscribe)链接观察者和被观察者

创建观察者

// create 最基础的创建被观察者的方法
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {

    }
});

// just
Observable<String> observable_just = Observable.just("a", "b", "c");

// from
Observable observable1 = Observable.fromArray(new String[]{"1", "2", "3"});

创建被观察者

// observer
Observer<String> observer = new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {

    }

    @Override
    public void onNext(String s) {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
};

// subscriber implement observer
Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onSubscribe(Subscription s) {

    }

    @Override
    public void onNext(String s) {

    }

    @Override
    public void onError(Throwable t) {

    }

    @Override
    public void onComplete() {

    }
}

订阅

observerable.subscribe(observer);
// 或者
observerable.subscribe(subscriber);

4. 操作符,英文好的话建议直接阅读官方文档, 文档中有实例动画,参考便于理解

创建observables

create
just
from

defer,每次被订阅的时候才会去创建observable,不订阅不创建

range
empty/never/error
interval,创建一个observable,按指定的周期发送一串整形数字
timer,类似interval,但是只有两个参数,不能指定周期
repeat 复制另一个observable对象,obserable.repeat();
start,创建一个observable,发射一个方法的返回值

转换observable

map,将一个函数应用到observable的每一项,并把结果发送出去
flatmap,使用传递过来的事件对象创建了一个observable对象,并不发送这个observable而是将他激活,于是它开始发送事件,每一个创建出来的observable发送的事件都被汇入同一个observable
buffer(count,skip),用buffer集合收集数据,并把这些buffer集合发送出去
scan,将一个方法应用到每个项,并发射每个结果({1,2,3} -> sub(a+b) -> {1,3,6}),与reduce类似,但reduce只发射最后一项的结果
window,用observable收集数据,最后将这些observable收集起来发送出去
groupby,用于分类

过滤 Observeables

debounce(当时间跨度内没有再发出项目,则发送该项目,否则不发送)
distinct(去重)
elementAt(只发出第n项)
filter(只发送通过测试的哪些项)
first(只发出第一项或者满足条件的第一项)
ignoreelements(不发出任何项目)
last(只发出最后一项或者满足条件的最后一项)
take(只发出observable发出的前n项)
takelast(只发出observable发出的最后几项)
sample (在周期性的间隔中发出observable发出的最新项目)
skip(抑制observable发出项目的前几项)
skiplast(抑制observable发出项目的后几项)

组合 observable

and/then/when ([unknown]通过Pattern和Plan中间人组合两个或多个Observable发出的项目集)
combinelatest (当两个Observable中的任何一个发出一个项目时,通过指定的函数组合每个Observable发出的最新项目,并根据此函数的结果发出项目)
join (在根据另一个Observable发出的项目定义的时间窗口期间发出一个Observable中的项目时,组合两个Observable发出的项目)
merge (通过合并排放,将多个observable合并为1个)
startwith (将另外一个observable加到一个observable的开头)
switch
zip (通过指定的功能将多个observable的排列组合在一起,并根据此功能的结果为每个组合发送单个项目)

5. 线程调度

6. 应用实践

7. 与第三方库的混用

Mupdf编译

发表于 2019-05-06

MuPDF编译

以mupdf-android-viewer-old为例

  1. git clone
  2. git submodule update –init
  3. make generate
  4. assemble installDebug

linux下使用apktool

发表于 2019-05-06

linux使用apktool

  1. 下载apktool脚本文件。apktool脚本下载地址,下载完最好直接改名为apktool
  2. 下载apktool.jar文件,apktool.jar下载任意release版本,下载完最好直接改名为apktool.jar
  3. 将apktool脚本文件和apktool.jar文件移动到/usr/local/bin/目录下(此步骤需要root用户下操作)
  4. 确保脚本文件名为apktool,jar包文件名为apktool.jar,如果不对请修改
  5. 给这两个文件设置可执行权限,这里直接给所有权限了,chmod 777 apktool/chmod 777 apktool.jar
  6. 在终端使用apktool命令,验证是否成功

注意:

  1. 注意最好在root下进行操作
  2. 如果有如下报错:java.lang.UnsupportedClassVersionError: brut/apktool/Main,原因是java版本过低,请修改你的jdk版本。
1…456…10
Sparky

Sparky

我是谁?我在做什么?我为什么要这么做?我想做什么?我要怎么做?

99 日志
© 2019 Sparky
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4