一、思考❓❔
1.如果一个接口需要使用内部的加密方式(jar包中的Java类)加密之后,才能请求,怎么办呢?
- 向开发认怂?不,不,不,这不是我们的风格
- 国内外各种搜索引擎神器一顿狂搜,“Jmeter如何加载jar包?”、“Python中如何运行Java程序?”
2.要用Python做自动化测试,那么Python中执行java程序,难不难呢?
- 不难不难,学会了就不难了,,,滚滚滚出去!!!
- 用JPype模块真的不难
二、案例前景?
1.前景介绍
- 小优优同学现在负责公司的自动化测试工作
- 公司的项目都是java开发的
- 小优优学过Python,Python编程有几把刷子,但Java却是一窍不通
- 现在需要使用Python来对接口进行自动化测试
- 但问题来了,公司里的接口需要使用内部专用的加密方式来对请求参数进行加密,这该如何是好?
2.用于接口请求参数加密的jar包源码(部分)
- 开发丢给了她一个jar包,她一脸懵逼,无奈,只好请教开发哥哥
- 开发哥哥给她解释了一下源码,她,嗯嗯嗯嗯,貌(yi)似(ran)懂(meng)了(bi)
package com.lemon;
import 各种依赖包;
public class EncryptUtils {
private static RSAPublicKey publicKey;
private static final String DEFAULT_PUBLIC_KEY = "xxx公钥";
...
// rsaEncrypt为加密的方法,参数为待加密的字符串数据
public static String rsaEncrypt(String string) {
byte[] binaryData = null;
...
String base64String = (new BASE64Encoder()).encodeBuffer(binaryData);
return base64String;
}
三、案例实操??
1.安装Jpype模块
- Python版本要求
- Python 2.6以上版本都可以(包含Python3)
- Java版本要求
- Java 7到Java 11都支持
pip install -i https://pypi.douban.com/simple JPype1
2.操作步骤
-
导入相关模块
# a. 导入模块 import jpype # b. 开启java导入 import jpype.imports # c. 导入Java中的类型 # 会导入'JBoolean', 'JByte', 'JChar', 'JShort', 'JInt', 'JLong', 'JFloat', 'JDouble' # 与Java中的类型一一对应 # 可以全部导入,也可以按需导入 from jpype.types import *
-
导入jar包
# 假设:jar包存放在项目根目录下的libs目录中 # a. 从指定目录(libs)下导入多个jar包文件 # b. 路径名最后要使用*号 # jpype.addClassPath("libs/*") # 或者导入指定的某一个jar包 jpype.addClassPath("libs/lemoner.jar")
-
开启Java虚拟机
# convertStrings设为False,关闭警告信息 # 开启java虚拟机 jpype.startJVM(convertStrings=False)
-
导入jar包中的类
# 创建Java中的字符串变量 srcText = JString("待加密的参数") # 导入Jar包中的EncryptUtils(真正用于加密的Java类) # 方法一: 使用JClass # a. JClass需要接收jar包中类所在的包路径(需要使用 逆序域名.包名) # b. JClass("com.lemon.EncryptUtils")会创建一个Java中EncryptUtils类 # c. 调用EncryptUtils类中的rsaEncrypt静态方法,同时给其传参(Java中的字符串) result = JClass("com.lemon.EncryptUtils").rsaEncrypt(srcText) # 方法二: 使用JPackage # a. 给JPackage传递Jar包中Java类所在域名(顶级域名) # b. jpype.JPackage("顶级域名").下一级域名.类名.静态方法名(参数) # c. 或者jpype.JPackage("顶级域名").下一级域名.类名().实例方法名(参数) # result = jpype.JPackage("com").lemon.EncryptUtils.rsaEncrypt(srcText) # 方法三: 使用registerDomain注册顶级域名 # a. 注册顶级域名 # b. 从顶级域名开始导入(IDE工具,Pycharm会标红,可忽略) # jpype.domains.registerDomain("com") # from com.lemon.EncryptUtils import rsaEncrypt # result = rsaEncrypt(srcText) # 打印加密之后的数据result # 方法一:使用java中的println打印 # jpype.java.lang.System.out.println(result) # 方法二:使用Python中的print打印 print(result)
-
关闭Java虚拟机
jpype.shutdownJVM()
四、总结??
- 本文介绍了在Python中调用Java类的方法
- 对于做Python自动化测试要调用Java模块的人有较大帮助
- 本文为可优原创,有不足之处,请多指教!
欢迎来到testingpai.com!
注册 关于