android 自动打包测试
来源:互联网 发布:物理实验数据处理软件 编辑:程序博客网 时间:2024/05/22 20:58
本方案涉及到的知识点:
1.python基本知识的使用,如:http请求库requests的使用
2.gradle 的基本知识,做过android开发的相信对这一块不陌生,这里只需要了解基本的task创建即可,如果对gradle感兴趣建议系统看下gradle与groovy方面的知识。
3.在tomcat平台下使用java解析上传的文件
4.生成二维码的工具。
方案详细设计:
1.目前android studio开以的项目采用的gradle进行编译的,通常一个项目编译配置文件如下 :
apply plugin: 'com.android.application'android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.baize.autobuild" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } task uploadApk { def upUrl = "http://localhost:8080/netTest/upload.jsp" def apkPath = "D:/demo/AutoBuild/app/build/outputs/apk/app-debug.apk" //执行Python脚本 def process = "python autobuild.py ${upUrl} ${apkPath}".execute() println("开始上传至fir") //获取Python脚本日志,便于出错调试 ByteArrayOutputStream result = new ByteArrayOutputStream() def inputStream = process.getInputStream() byte[] buffer = new byte[1024] int length while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length) } println(result.toString("UTF-8")) println "上传结束 " }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12'}
里面的配置的诸如:依赖包,引用插件机制等这些可以放一边,了解即可。
但是有一个地方需要注意,也是这个方案的核心地方,下面红色框住的地方:
这个task的意图:
将编译好的的apk上传的服务器中去
上传的方式为执行python脚本
注意python脚本为:
# coding=utf-8# encoding = utf-8import requestsimport sysclass buildTool(object):url = 'http://localhost:8080/netTest/index.jsp'apkUrlTest = 'http://localhost:8080/netTest/upload.jsp'apkPathTest = ur'test123.apk'"""docstring for ClassName"""def __init__(self):super(buildTool,self).__init__()def testGet(self):requestParams = {'username':"liubaize","pwd":"123456789"}try:result = requests.get(url = self.url,params = requestParams)result.encoding = "utf-8"print "19--------------get inputstream from server:",result.textprint "21--------------get byte from server:",result.contentprint "22--------------get json from server:",result.json()print "23--------------get status_code from server:",result.status_codeexcept Exception as e:print '25--------------get request error:',edef uploadApk(self):if len(sys.argv) <= 2:returnapkServerUrl = sys.argv[1]apkPath = sys.argv[2]print'36-------------------:',apkPathprint '37------------------:',apkServerUrltry:file = {'file': open(apkPath, 'rb')}req = requests.post(url= apkServerUrl, files=file)print '40---------------:upload result:',req.textexcept Exception as e:print'41---------------upload apk error:',eif __name__ == '__main__':mAndroidBuild = buildTool()mAndroidBuild.uploadApk()
文件放在项目的根目录下,注意你的开发环境是否已经安装了requests库
服务器解析上传文件采用的是java开发,因为比较简单,直接给出源码吧:
package netTest;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Iterator;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.DiskFileUpload;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;@SuppressWarnings({ "deprecation", "serial" })public class FileUpload {public FileUpload() {super();}public void doGet(HttpServletRequest request, HttpServletResponse response) {try {doPost(request, response);} catch (ServletException e) {System.out.println("PicUpload......doGet......" + e.toString());} catch (IOException e) {System.out.println("PicUpload......doGet2......" + e.toString());}}/** * 使用Apache文件上传组件处理文件上传步骤: * 1、创建一个DiskFileItemFactory工厂 * 2、创建一个文件上传解析器 * 3、判断提交上来的数据是否是上传表单的数据 * 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 * @param request * @param response * @throws ServletException * @throws IOException */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String savePath = request.getSession().getServletContext().getRealPath("/upload");File file = new File(savePath);if (!file.exists() && !file.isDirectory()) {file.mkdir();}String message = "";try { DiskFileItemFactory factory = new DiskFileItemFactory();// 1、创建一个DiskFileItemFactory工厂ServletFileUpload upload = new ServletFileUpload(factory);// 2、创建一个文件上传解析器upload.setHeaderEncoding("UTF-8");if (!ServletFileUpload.isMultipartContent(request)) {// 3、判断提交上来的数据是否是上传表单的数据return;}List<FileItem> list = upload.parseRequest(request);// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项for (FileItem item : list) {if (item.isFormField()) {// 如果fileitem中封装的是表单输入项的数据String name = item.getFieldName();String value = item.getString("UTF-8");System.out.println("上传的文件名为:" + name + "=" + value);} else {// 如果fileitem中封装的是上传文件String filename = item.getName();System.out.println("上传的文件名为:" + filename);if (filename == null || filename.trim().equals("")) {continue;} filename = filename.substring(filename.lastIndexOf("\\") + 1);InputStream in = item.getInputStream();FileOutputStream out = new FileOutputStream(savePath + "\\"+ filename);byte buffer[] = new byte[1024];int len = 0;while ((len = in.read(buffer)) > 0) {out.write(buffer, 0, len);}in.close();out.close();item.delete();message = "文件上传成功!";PrintWriter pw=response.getWriter();pw.write("upload success!!");pw.flush();pw.close(); System.out.println(message);}}} catch (Exception e) {message = "文件上传失败!";e.printStackTrace();}/*request.setAttribute("message", message);request.getRequestDispatcher("/message.jsp").forward(request, response);*/}public void init() throws ServletException {// Put your code here}}
上面几个都配置好的话,在编译apk的时候,在控制台就是出现如下:
最后用一个二维码把这个apk的url地址呈现给测试即可
到这一步,一个简单的自动打包测试方案就出炉了
附:
在gradle中编译也是按照task 有序执行的
Android task 简单介绍
Android plugin继承基础task并实现他们的行为。这是在Android环境中task所做的事情:
-assemble:为每一个build类型创建APK;
-clean:移除所有build产品,例如APK文件;
-check:实现lint检测,如果lint检测到问题放弃build;
-build:运行assemble和check;
- android 自动打包测试
- Linux测试Android的Python2.7的自动打包环境
- android自动打包
- android 多渠道自动打包
- Android自动打包
- android自动打包
- Android 自动 打包
- Android 多渠道自动打包
- Android平台自动打包
- android 自动打包
- android自动打包签名
- android自动打包
- android命令行打包、签名+自动打包器
- android命令行打包、签名+自动打包器
- Android自动打包之命令行打包
- android命令行打包、签名+自动打包器
- iOS 自动打包工具 + 分发测试
- Android使用Ant自动打包
- Java设计模式百例
- 关于 Notice: Undefined index: 2 in C:\wamp\www\...报错
- iOS开发之复制粘贴 剪切
- 多线程编程
- Boostrap-datetimepicker 日期时间选择器————时间制约
- android 自动打包测试
- DNS测试bat脚本分析
- PostgreSQL on ECS SLA 流复制备库+秒级快照+PITR+自动清理
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。
- json文件和xml文件
- weblogic数据源和应用部署
- WebService入门
- 3、ligerUI---Grid
- Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统