前言
自動化測試應(yīng)用越來越多了,尤其是接口自動化測試。
在接口測試數(shù)據(jù)傳遞方面,很多公司都會選擇對請求數(shù)據(jù)進行加密處理。
而目前為主,大部分公司的產(chǎn)品都是java語言實現(xiàn)的。所以加密處理也是java實現(xiàn)的。
作為用python做測試的我,要做接口自動化時,如何去對請求數(shù)據(jù)進行加密呢?
?
解決方法
基于此,首先去找開發(fā)了解一下具體的加密過程,甚至可以畫一個加密流程圖出來。
一種方法是:用python代碼去實現(xiàn)加密流程。
對測試人員技術(shù)能力有所要求,對加密的實現(xiàn)也需要與開發(fā)人員密切進行交流。
另外一種便捷的方法就是:直接用python語言調(diào)java的加密方式,得到加密后的數(shù)據(jù)。
這種方式的好處:不用管加密的過程。只要知道如何調(diào)用、怎么傳加密數(shù)據(jù),怎么得到加密后的數(shù)據(jù)就可以。
?
使用python語言調(diào)用java加密代碼 - 方式一
此處感謝歪歪大佬提供了java版加密代碼。本篇文章中,歪歪大佬角色:開發(fā)GG
1、了解需要用到的加密信息
而我作為測試MM((有一點java基礎(chǔ)的)做的第一件事情就是:
愉快的和開發(fā)GG聊起了天,咨詢了在Java的加密方式中,調(diào)用哪個函數(shù)可以實現(xiàn)數(shù)據(jù)加密
第二件事情,就是讓開發(fā)GG給我打了一個jar包。這樣我用python代碼直接調(diào)用jar包里的函數(shù)就可以了。
?
?
?
2、開始編寫python代碼,調(diào)用java包里的加密函數(shù)。
python是膠水語言,可以與很多語言一起使用。
python3有個第三方庫Jpype1(下載地址:https://pypi.org/project/JPype1/)
將開發(fā)提供的jar包放在py工程的目錄下面。
?
?
python代碼如下(看每一行代碼的注釋哦):
1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # Name: use_jar 4 #
Author: liyuan 5 # Time: 17:01 6 7 import jpype # 引入庫 8 9 import os 10
jvmpath = jpype.getDefaultJVMPath()# 獲取本地默認(rèn)使用的java JVM路徑。 11 #
獲取jar包的位置。將jar包放在python的目錄下面。 12 jarpath =
os.path.join(os.path.split(os.path.abspath(__file__))[0],"jars/") 13 print
(jarpath)14 # 啟動java環(huán)境。-Djava.class.path指定要應(yīng)用的jar包。 15 jpype.startJVM(jvmpath,"
-ea", "-Djava.class.path=%s" % (jarpath + 16 '
encryption-0.0.1-SNAPSHOT-jar-with-dependencies.jar')) 17 #
通過jpype編寫java的輸出語句,打印hello world! 18 jpype.java.lang.System.out.println("hello
World") 19 20 # 使用jar包中的類。通過包名.類名。包名為:com.lemon.encryption.類名為:RSAManager. 21 #
JDClass代表RSAManager類。 22 JDClass = jpype.JClass("com.lemon.encryption.RSAManager
") 23 # 類的實例化。開發(fā)GG告訴我不需要實例化,直接調(diào)用就可以。是靜態(tài)類。 24 # jd = JDClass() 25 #
調(diào)用類下的加密函數(shù):encryptWithBase64,傳的參數(shù)為:1234 26 # res用來接收加密函數(shù)的返回值。即加密后加密數(shù)據(jù)。 27 res =
JDClass.encryptWithBase64("1234") 28 print(res) # 打印加密數(shù)據(jù) 29 30 # 關(guān)閉JVM 31
jpype.shutdownJVM()
?
運行此段代碼之后,對數(shù)據(jù)1234的加密結(jié)果 為:
?
使用python語言調(diào)用java加密代碼 - 方式二
在完成以上操作之后,我又開始和開發(fā)GG聊了起來,問了一句,我可以直接給jar包傳參嗎?不用去調(diào)用java的函數(shù),在調(diào)用jar包的同時
給它傳參,直接得到加密后的數(shù)據(jù)?
開發(fā)GG說,可以!等我改一下,我重新發(fā)一個jar給你。
于是,5分鐘后,開發(fā)GG甩了我一個新的jar包,告訴我使用方式。我又愉快的開啟了第二種使用模式。
使用方式是這樣的:在命令行當(dāng)中使用java命令行:java -jar jar包 -d 要加密的數(shù)據(jù)。命令行輸出的就是加密后的數(shù)據(jù)了。
我在命令行試了一下,果真如此:
?
于是,我轉(zhuǎn)換成了python代碼(需要獲取命令行執(zhí)行的結(jié)果,所以要用到subprocess模塊):
1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 # Name: use_jar_os 4 #
Author: liyuan 5 # Time: 17:32 6 7 import os 8 import subprocess 9 import
chardet10 11 # 獲取jar包路徑 12 jarpath = os.path.join(os.path.split(os.path.abspath(
__file__))[0], 13 "jars/encryption-0.0.1-SNAPSHOT-jar-with-dependencies-2.jar")
14 # 終端命令行命令。加密的數(shù)據(jù)為:hello,java 15 command = "java -jar {} -d {}".format(jarpath,
"hello,java") 16 # 執(zhí)行command的,并獲取命令執(zhí)行之后的輸出數(shù)據(jù)。 17 stdout,stderror =
subprocess.Popen(command,stdout=subprocess.PIPE 18
,stderr=subprocess.PIPE,shell=True).communicate() 19 # 編碼處理 20 encoding =
chardet.detect(stdout)["encoding"] 21 result = stdout.decode(encoding) 22 print
(result)
?
?
執(zhí)行結(jié)果如下:
?
?
?
綜上,當(dāng)我們在用python遇到 java加密的時候。可以使用以上2種方式來利用java加密得到加密后的數(shù)據(jù)。
當(dāng)然,在這個過程中,我也會遇到問題。當(dāng)有問題時,我會向開發(fā)GG咨詢,因為從啟動JVM之后,都是java了,運行出錯了或者整不明白的,我都會向開發(fā)GG請教。
所以,在工作當(dāng)中有什么問題,自己查資料的基礎(chǔ)上,多與相關(guān)人員進行溝通,帶著具體的問題去溝通和請教。
最后,希望大家也可以多多有自己解決問題的能力。
熱門工具 換一換