使用python测试JS代码的方法、存储介质、设备和系统
技术领域
本发明涉及人机识别技术领域,具体涉及一种使用python测试JS代码的方法、存储介质、设备和系统。
背景技术
JS,全称为JavaScript,是因特网上最流行的脚本语言,其可以在所有主要的浏览器中运行,比如Internet Explorer、Chrome、Mozilla Firefox、Netscape、和Opera等。
目前,WEB程序的编程语言是JavaScript,其是一种动态脚本语言,发布时相当于是源码发布,造成其极易被破解,对于一些核心的JavaScript代码,则很多开发者会编写代码来生成JavaScript的代码,从而可以经常的进行更换和加强其安全性。同时,为了保障自动生成的JavaScript代码的准确性,则需要一种方法来对自动生成的JavaScript代码进行测试,以验证自动生成的代码是否准确。
现有技术中,测试自动生成的JavaScript代码是否正确的方法是:将生成的JavaScript代码放到浏览器中运行从而查看运行的结果是否正确。
然而,由于在生成JavaScript代码时会依据各种条件生成大量的JavaScript代码,例如,在验证登录的用户名是否正确时,由于用户名可能是全中文、全英文、字符或其他任意方式的组合等,因此,在测试时,需要分别对各种不同类型的用户名进行测试,即对应有大量测试用的JavaScript代码,若将这些大量的JavaScript代码均放到浏览器中去执行,过程繁琐,使用起来非常不便。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种使用python测试JS代码的方法,不仅测试效率较高,测试性能好,而且,可移植性好,适用范围更广,修改起来更加方便快捷。
为达到以上目的,本发明采取的技术方案是:
一种使用python测试JS代码的方法,其用于测试JS代码是否正确,包括步骤:
编写python代码,在python代码中调用并执行JS代码,得到JS代码的执行结果;
在DLL文件中增加与JS代码功能相同的功能函数,在python代码中调用所述功能函数,得到该功能函数的执行结果;
比较JS代码的执行结果和功能函数的执行结果是否一致,并根据比较结果判断所述JS代码是否正确。
在上述技术方案的基础上,在python代码中调用并执行JS代码的具体步骤为:在python代码中引入pyv8功能库;初始化执行JS代码的上下文环境,并创建一个环境变量;通过所述环境变量加载JS代码;在python代码中执行JS代码。
在上述技术方案的基础上,在python代码中调用所述功能函数的具体步骤为:在python代码中引入ctypes功能库,并加载DLL模块,通过所述DLL模块调用所述功能函数。
在上述技术方案的基础上,所述功能函数为C语言函数。
本发明还提供了一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述方法的步骤。
本发明还提供了一种电子设备,包括存储器、处理器及存储在所述存储器上并在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述方法的步骤。
本发明还提供了一种使用python测试JS代码的系统,所述系统包括第一设置模块、第一调用模块、第二设置模块、第二调用模块和比较模块;
所述第一设置模块用于编写python代码;
所述第一调用模块用于在python代码中调用并执行JS代码,得到JS代码的执行结果;
所述第二设置模块用于在DLL文件中增加与JS代码功能相同的功能函数;
所述第二调用模块用于在python代码中调用所述功能函数,得到该功能函数的执行结果;
所述比较模块用于比较JS代码的执行结果和功能函数的执行结果是否一致,并根据比较结果判断所述JS代码是否正确。
在上述技术方案的基础上,所述第一调用模块包括第一功能库设置单元、初始化单元、创建单元、加载单元和执行单元。
所述第一功能库设置单元用于在python代码中引入pyv8功能库;
所述初始化单元用于初始化执行JS代码的上下文环境;
所述创建单元用于创建一个环境变量;
所述第一加载单元用于通过所述环境变量加载JS代码;
所述执行单元用于在python代码中执行JS代码。
在上述技术方案的基础上,所述第二调用模块包括第二功能库设置单元、第二加载单元和函数调用单元;
所述第二功能库设置单元用于在python代码中引入ctypes功能库;
所述第二加载单元用于加载DLL模块;
所述函数调用单元用于通过所述DLL模块调用所述功能函数。
在上述技术方案的基础上,所述功能函数为C语言函数。
与现有技术相比,本发明的优点在于:本发明的使用python测试JS代码的方法,一方面,可以适用于测试大量的JavaScript代码,测试效率较高,而且测试性能好;另一方面,由于python为解释性语言,可移植性好,只要有解释环境,即可在不同的操作系统上运行,因而可适用于多种测试环境,适用范围更广,而且,若需修改代码,直接修改后即可运行,无需编译,修改起来更加方便快捷。
附图说明
图1为本发明实施例中使用python测试JS代码的方法的流程图;
图2为本发明实施例中电子设备的连接框图。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
参见图1所示,本发明实施例提供一种使用python测试JS代码的方法,其用于测试JS代码是否正确,在本发明实施例中,该待检测的JS代码为自动生成的JavaScript代码,以通过计算房间的KEY值来实现加法功能为例。
对于房间号0的JavaScript代码如下:
function RoomEncrypt(nRoomId)
{
return nRoomId+0x457892ac;
}
对于房间号1的代码如下:
function RoomEncrypt(nRoomId)
{
return nRoomId+0x8cbd92ac;
}
上述自动生成的JavaScript代码是一个依据房间号计算得到一个加密的数据。对于不同的房间号,由于其中的0x457892ac和0x8cbd92ac值不一样,所以每个房间的JavaScript代码是不一样的。从而实现了每个房间号使用不同的代码。
本发明实施例中使用python测试JS代码包括步骤:
S1:编写python代码,在python代码中调用并执行JS代码,得到JS代码的执行结果。在python的功能库中,有pyv8库,其是对JavaScript引擎V8进行了封装,从而支持python调用,本发明实施例则是基于pyv8库来调用上述自动生成的JavaScript代码并获取执行的结果。
本发明实施例中,在python代码中调用并执行JS代码的具体步骤为:
S101:在python代码中引入pyv8功能库,代码如下:
import PyV8
编写python代码import Pyv8则实现了引入pyv8的功能库到pyhon代码中。
S102:初始化执行JS代码的上下文环境,并创建一个环境变量,代码如下:
ctxt=PyV8.JSContext()
上述代码则定义了一个执行JavaScript代码的上下文环境,并创建了一个环境变量ctxt。
ctxt.enter()
并通过上下文环境变量ctxt来初始化。
S103:通过环境变量ctxt加载需要执行的JS代码,代码如下:
ctxt.eval("""
function RoomEncrypt(nRoomId)
{
return nRoomId+0x457892ac;
}
""")。
S104:在python代码中执行JS代码,代码如下:
Func=ctxt.locals.RoomEncrypt;
result=Func(123);
通过环境变量来获取到JavaScript的函数RoomEncrypt,并传入房间号为123来执行得到执行结果result,从而通过此方法可以调用任意JavaScript代码来获取执行结果。
S2:在DLL文件中增加与JS代码功能相同的功能函数,在python代码中调用功能函数,得到该功能函数的执行结果。在本实施例中,功能函数优选为为C语言函数,C语言代码为基础的编译型语言,使用起来更加方便,且安全可靠。
本发明实施例中,在python代码中调用功能函数的具体步骤为:
S201:在python代码中引入ctypes功能库,代码如下:
import ctypes
编写python代码import ctypes则实现了引入ctypes的功能库到pyhon代码中。
from ctypes import*
引入ctypes的所有定义及方法。
S202:在python代码中加载DLL模块,代码如下:
api=CDLL('xx.dll');
其中‘xx.dll’标示提供的DLL模块的文件名称,从而实现该DLL模块的所有函数可以通过api这个变量来获取。
S203:通过DLL模块调用功能函数。对于JavaScript代码中编写的一个功能函数function RoomEncrypt(nRoomId),其肯定对应一个编写的C语言函数,在DLL文件中增加与JS代码功能相同的功能函数,其可提供给服务器来调用,即可实现在python代码中调用功能函数,得到该DLL文件中对应功能函数的执行结果,从而来判断客户端上报的结果是否正确。
在DLL文件中与JavaScript代码的功能函数function RoomEncrypt(nRoomId)对应的功能函数如下:
Int cRoomEncrypt(int nRoomId)
{
return nRoomId+0x457892ac;
}
此函数则是在DLL模块中,python则可以加载此模块,获取函数cRoomEncrypt来执行得到执行结果。
在调用过程中,首先要先定义此功能函数的参数
api.cRoomEncrypt.argtypes=[c_uint]
其中api.cRoomEncrypt.argtypes表示函数cRoomEncrypt的参数类型说明,[c_uint]表示只有一个参数,类型是uint类型。
nRoomId=c_uint(123)
然后定义一个uint类型的变量,作为此功能函数的执行参数,本实施例中则定义变量为nRoomId,其初始值为123。
通过DLL模块调用功能函数实现过程如下:
cResult=api.cRoomEncrypt(nRoomId);
执行上述代码即可得到执行结果cResult。
S3:比较JS代码的执行结果和功能函数的执行结果是否一致,并根据比较结果判断JS代码是否正确。
本发明实施例中的使用python测试JS代码的系统,一方面,编写python代码,在python代码中调用并执行JS代码,得到JS代码的执行结果;另一方面,在DLL文件中增加与JS代码功能相同的功能函数,在python代码中调用功能函数,得到DLL文件中功能函数的执行结果,并通过对比这两个执行结果,来判断这两个执行结果是否一致,从而判断自动生成的JS代码是否正确。在默认情况下,DLL文件中功能函数的执行结果是正确的,若两个结果一致,则说明自动生成的JS代码正确,若两个结果一致,则说明自动生成的JS代码正确。
本发明实施例中的使用python测试JS代码的方法,一方面,可以适用于测试大量的JavaScript代码,测试效率较高,而且测试性能好;另一方面,由于python为解释性语言,可移植性好,只要有解释环境,即可在不同的操作系统上运行,因而可适用于多种测试环境,适用范围更广,而且,若需修改代码,直接修改后即可运行,无需编译,修改起来更加方便快捷。
本发明实施例还提供了一种存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述方法的步骤。
本发明实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并在处理器上运行的计算机程序,其特征在于:处理器执行计算机程序时实现上述方法的步骤。
本发明实施例还提供了一种使用python测试JS代码的系统,系统包括第一设置模块、第一调用模块、第二设置模块、第二调用模块和比较模块;
第一设置模块用于编写python代码;
第一调用模块用于在python代码中调用并执行JS代码,得到JS代码的执行结果;
第二设置模块用于在DLL文件中增加与JS代码功能相同的功能函数;
第二调用模块用于在python代码中调用功能函数,得到该功能函数的执行结果;
比较模块用于比较JS代码的执行结果和功能函数的执行结果是否一致,并根据比较结果判断JS代码是否正确。
进一步地,第一调用模块包括第一功能库设置单元、初始化单元、创建单元、加载单元和执行单元。
第一功能库设置单元用于在python代码中引入pyv8功能库;
初始化单元用于初始化执行JS代码的上下文环境;
创建单元用于创建一个环境变量;
第一加载单元用于通过环境变量加载JS代码;
执行单元用于在python代码中执行JS代码。
进一步地,第二调用模块包括第二功能库设置单元、第二加载单元和函数调用单元;
第二功能库设置单元用于在python代码中引入ctypes功能库;
第二加载单元用于加载DLL模块;
函数调用单元用于通过DLL模块调用功能函数。
优选地,功能函数为C语言函数,C语言代码为基础的编译型语言,使用起来更加方便,且安全可靠。
本发明实施例中的使用python测试JS代码的系统,一方面,编写python代码,在python代码中调用并执行JS代码,得到JS代码的执行结果;另一方面,在DLL文件中增加与JS代码功能相同的功能函数,在python代码中调用功能函数,得到DLL文件中功能函数的执行结果,并通过对比这两个执行结果,来判断这两个执行结果是否一致,从而判断自动生成的JS代码是否正确。在默认情况下,DLL文件中功能函数的执行结果是正确的,若两个结果一致,则说明自动生成的JS代码正确,若两个结果一致,则说明自动生成的JS代码正确。
本发明实施例中的使用python测试JS代码的系统,一方面,可以适用于测试大量的JavaScript代码,测试效率较高,而且测试性能好;另一方面,由于python为解释性语言,可移植性好,只要有解释环境,即可在不同的操作系统上运行,因而可适用于多种测试环境,适用范围更广,而且,若需修改代码,直接修改后即可运行,无需编译,修改起来更加方便快捷。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。