首页 文章 精选 留言 我的

精选列表

搜索[解释型编程语言],共10000篇文章
优秀的个人博客,低调大师

增强型MonkeyRunner 脚本计划

前一段时间写的monkeyrunner资料 http://youxilua.blog.51cto.com/3357586/772666 功能说明: 可以自动安装apk到android模拟器或者android实机 可以截取设定好activity运行在android模拟器或者android实机上的效果图 截图根据设备名和截取时间保存 能够自动设别所有运行中的android模拟器或者android实机 能够自动安装在特定文件夹下所有的apk文件到android模拟器或者实机 功能实现: 环境配置: 设置好android /tootls 和 android /platform-tools 目录的到环境变量中,确保adb命令能够在cmd下正常运行 脚本编写: 该功能需要创建以下几个文件 componentName.txt 使用约定 每一行为需要运行的activity的完整名字 例如: kg.tom/.HandlerThreadActivity kg.monkey/.MonkeyActivity takeSnap.bat @echo off rem 获取当前运行设备 adb devices > devices.txt rem 获取APK文件 dir apk /B > apk.txt rem 运行monkeyrunner 脚本 monkeyrunner work.py xxxx 核心运行脚本: #导入我们需要用到的包和类并且起别名 import sys,time,datetime from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi deviceslist = [] devices = [] snapshot = [] templist = [] f = open("devices.txt") while True: line = f.readline() if line: templist.append(line.strip()) else: break; f.close() templist.pop() for i in range(len(templist)): deviceslist.append(templist[i].split('\t')) fc = open("componentName.txt") complist = [] while True: comp = fc.readline() if comp: complist.append(comp.strip()) else: break; fc.close() fp = open("apk.txt") apklist = [] while True: apk = fp.readline() if apk: apklist.append(apk.strip()) else: break; print 'apk list :'print apklist print 'start componentName list :' print complist print 'devices list:'print deviceslist for i in range(1,len(deviceslist)): print 'current devices:' print deviceslist[i] devices.append(mr.waitForConnection(1.0,deviceslist[i][0])) #安装apk文件 for j in range(len(apklist)): devices[i-1].installPackage('apk/'+apklist[j]) #启动activity for k in range(len(complist)): print 'current start activity:' print complist[k] devices[i-1].startActivity(component=complist[k]) #设置延时秒数 mr.sleep(5.0) #---------------- #这里可进行一定的UI操作 #---------------- #mr.sleep(3.0) #进行截图 snapshot.append(devices[i-1].takeSnapshot()) print 'end snapshot' #创建时间字符串 t = time.strftime("%Y-%m-%d-%X",time.localtime()) t = t.replace(":","-") #保存截图 package = complist[k].replace('/.','.') snapshot[0].writeToFile('takeSnapshot/'+deviceslist[i][0]+'-'+t+'-'+package+'.png','png'); snapshot.pop() 由于之前毫无编写python的经验,只能写成这样了,欢迎高手补充!!!!!! 使用: 把tools文件夹里面的全部文件,同样放在android sdk tools 文件夹下即可,运行takeSnap.bat就可以获取到多个设备运行时的截图了,这个期间…你可以选择去泡一杯咖啡…耗时情况…看你要测试几个设备,还有如何测试了…… 效果图: 三个虚拟机,在一台实机,测试两个apk在这些设备的运行境况 以下为全部截图文件: 以后可能会更新的部分和改善的地方 1,支持从外部读取monkeyrunner 脚本进行多设备运行…其实..现在这个也可以…只是没写上 2,同一样设备的截图放置在一样设备名的文件,(这个…其实补充起来也很快…不过,要做完善就要判断设备名与创建文件名是否合法等等,不过…我感觉,将所有截图放到一个文件夹下更方便用来比较,就没写了,有兴趣的自行补充…同时,也顺便贴到这里来吧…) 3,由于,本人的脚步编写功底实在是烂,不知道如何在运行环境中设置环境变量,就不得已要在android sdk tools目录 下运行,如果,觉得这个脚步还可以,希望帮忙完善,能够达到在任意目录下… 4,当设备是离线状态无法判断,不过,在以上的脚本中已经实现了获取设备的状态,只是,很少,碰到就懒得补充了…. 5,如果,出现无法连接设备…那么请再运行一遍…如果…还不行…就重启吧…这跟脚本没关系吧…貌似…就是有这种问题… 6,最后,附上下载地址: 本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/772652 如需转载请自行联系原作者

优秀的个人博客,低调大师

JDBC编程:JDBC高级编程

事物处理 批量更新 返回自动主键 DAO 1,事物处理 什么是事物? 事务(Transaction):数据库中保证交易可靠的机制。JDBC支持数据库中的事务概念,并且在JDBC中,事务默认是自动提交的。 事务提交的方式有两种: 显示提交:使用commit; 自动提交:执行DDL或DCL语句,或者程序正常退出; 当事务所包含的任意一个数据库操作执行失败后,应该回滚事务(rollback),使该事务中所做的修改全部失效。 事务回滚有两种方式: 显示回滚:使用rollback。 自动回滚:系统错误或者强行退出。 事务特性介绍:(ACID) (1)原子性(Atomicity):事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行 (2)一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态 (3)隔离性(Isolation):由并发事务所作的修改必须与任何其它并发事务所作的修改隔离 (4)持久性(Durability):事务完成之后,它对于系统的影响是永久性的 事务是数据库的概念,JDBC支持事务,本质还是在数据库中实现的。 JDBC中和事务相关API: Connection.getAutoCommit() :获得当前事务的提交方式,默认为true Connection.setAutoCommit():设置事务的提交属性,参数是true:自动提交;false:不自动提交 Connection.commit():提交事务 Connection.rollback():回滚事务 JDBC处理事务模式: (1)先将事务的自动提交关闭; (2)执行事务中的若干SQL语句; (3)事务提交;SQL失败则回滚; (4)恢复JDBC的事务提交状态;释放资源。 事务隔离级别: 事务的并发读问题: 脏读:读取到另一个事务未提交更新数据,即读取到了脏数据; 不可重复读:对同一记录的两次读取不一致,因为另一事物对该记录做了修改; 幻读(虚读):对同一张表的两次查询不一致,因为零壹拾伍插入了一条记录; 四大隔离级别: 四个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工具,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。 SERIAUZABLE(串行化):不会出现任何并发性问题,因为它是对同一数据的访问是串行的,非并发访问的。 性能最差 REPEATABLEREAD(可重复读):防止脏读和不可重复读,不能处理幻读问题。性能比SERIAUZABLE好 READCOMMITTED(读已提交数据):防止脏读,没有处理不可重复读,也没有处理幻读。性能比REPEATABLEREAD。 READUNCOMMITTED(读未提交数据):可能出现任何事物并发问题,性能最好; 2,批量更新 批量更新主要方法: PreparedStatement.addBatch():将多条预编译的SQL语句,添加到语句列表中。 PreparedStatement.executeBatch():把语句列表中的所有SQL语句,发送给数据库处理。 PreparedStatement.clearBatch():清空当前SQL语句列表。 批量添加: public int[] insBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //获取数据连接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 statement = connection.createStatement(); for (int i = 0; i < 10; i++) { StringBuffer sbf = new StringBuffer("insert into student (name, age, addr, hobby) "); sbf.append(" values ('kenx',24,'上海','篮球')"); sql = sbf.toString(); System.out.println("执行sql" + sql); //将指定SQL添加到Statement对象的当前命令列表中 statement.addBatch(sql); } //执行成功返回更新计数的数组 int[] success = statement.executeBatch(); //批量执行所有sql返回一个更新计数的数组 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //执行完数据库操作后记得关闭数据库连接资源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } 批量更新: public int[] updBatch() { Connection connection = null; Statement statement = null; String sql = ""; try { //获取数据连接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 statement = connection.createStatement(); for (int i = 1; i < 10; i++) { StringBuffer sbf = new StringBuffer("update student set hobby='足球'"); sbf.append(" where id=" + i); sql = sbf.toString(); System.out.println("执行sql" + sql); //将指定SQL添加到Statement对象的当前命令列表中 statement.addBatch(sql); } //执行成功返回更新计数的数组 int[] success = statement.executeBatch(); //批量执行所有sql返回一个更新计数的数组 return success; } catch (Exception e) { e.printStackTrace(); return null; } finally { //执行完数据库操作后记得关闭数据库连接资源 try { statement.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } 3,返回自动主键 JDBC API: ResultSet java.sql.Statement.getGeneratedKeys() throws SQLException 例: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class Tester { public static void main(String[] args) throws Exception { // 注册数据库驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***"); // 准备SQL String sql = "insert into user(name) values('Belin')"; // 准备语句,配置为自动返回生成主键。 PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); // 执行语句 pstmt.executeUpdate(); // 获取主键值,是一个ResultSet。 ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { System.out.println(rs.getInt(1)); } } } DAO: 什么是DAO? Data Access Object 数据访问对象,建立在数据库和业务层之间,封装所有对数据库的访问。 DAO的作用:将数据访问逻辑和业务逻辑分开。 DAO通常包括: ①,一个DAO工厂类 ②,一个DAO接口 ③,一个实现DAO接口的具体类 ④,数据传递对象(实体对象或值对象) 实体对象: 将java程序中的对象对应到关系数据库的表中 表和类对应 表中的字段和类的属性对应 记录和对象对应 实现的步骤: 先建立模型的对象domain; 编写DAO接口; 定义DAO实现类; 生产DAO测试类; 在DAO测试类中测试方法;

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册