[雪峰磁針石部落格]使用jython進行dubbo介面及ngrinder效能測試
快速入門(介面測試)
- 確認mvn和jdk、jython安裝ok。
- 先下載dubbo的demo,編譯執行demo。
# git clone https://github.com/alibaba/dubbo.git dubbo
# cd dubbo/
# mvn clean install -Dmaven.test.skip
# cd dubbo-demo/dubbo-demo-provider/target/
# tar xzvf dubbo-demo-provider-2.5.4-SNAPSHOT-assembly.tar.gz
# cd dubbo-demo-provider-2.5.4-SNAPSHOT/bin
# ./start.sh
# cd /opt/code/dubbo-demo/dubbo-demo-consumer/target/
# tar xzvf dubbo-demo-provider-2.5.4-SNAPSHOT-assembly.tar.gz
# cd dubbo-demo-consumer-2.5.4-SNAPSHOT/bin
# ./start.sh
注意:阿里的demo啟動指令碼有bug,如果啟動時報程式已經存在,請修改start.sh中的grep部分,增加” | grep -v grep”。
確認在consumer的的日誌可以看到”hello”輸出,恭喜你,dubbo的demo已經成功。現在關閉上面程式,用eclipse或其他IDE開啟工程進行修改。
下載完畢後解壓,執行:”# ./zkServer.sh start”
- 修改工程
修改工程dubbo-demo-provider和dubbo-demo-consumer的dubbo.properties:
dubbo.container=log4j,spring
dubbo.application.name=demo-provider
dubbo.application.owner=william
#dubbo.registry.address=multicast://224.5.6.7:1234
dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
#dubbo.monitor.protocol=registry
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.service.loadbalance=roundrobin
#dubbo.log4j.file=logs/dubbo-demo-consumer.log
#dubbo.log4j.level=WARN
dubbo-demo-consumer的pom.xml載入的內容太多,需要進行精簡,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-demo</artifactId>
<version>2.5.4-SNAPSHOT</version>
</parent>
<artifactId>dubbo-demo-consumer</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>The demo consumer module of dubbo project</description>
<properties>
<skip_maven_deploy>false</skip_maven_deploy>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${project.parent.version}</version>
<outputDirectory>${project.build.directory}/dubbo</outputDirectory>
<includes>META-INF/assembly/**</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
dubbo-demo-consumer工程新增demo.xml, 為jython訪問dubbo的定義。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="hello-world-app" />
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
</beans>
新增jython指令碼:
from org.springframework.context.support import ClassPathXmlApplicationContext
context = ClassPathXmlApplicationContext("demo.xml")
service = context.getBean("demoService")
print service.sayHello("How are you!")
重新執行第2步的編譯,並在CLASSPATH新增對應的目錄,比如:
export CLASSPATH=$CLASSPATH:/opt/lib/*
在IDE中執行:DemoProvider
執行:
$ jython dubbo_test.py
"my" variable $jythonHome masks earlier declaration in same scope at /usr/bin/jython line 15.
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hello How are you!, response form provider: 172.17.153.6:20880
java裡面也可以採用這種方法。下面修改DemoConsumer類:
package com.alibaba.dubbo.demo.consumer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.alibaba.dubbo.demo.DemoService;
public class DemoConsumer {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("demo.xml");
DemoService service = context.getBean(DemoService.class);
System.out.println(service.sayHello("How are you!"));
}
}
可見java的操作和jython是極其類似的,只是在實際測試中,java改動需要頻繁,帶來不少不便。實際應用通常把多個包含dubbo服務定義的檔案放在一個jar包中,這樣一個jython就可以靈活地測試多個dubbo介面。當然不同介面要載入的jar是不同的,好在jython可以動態修改CLASSPATH, 參見:http://www.jython.org/jythonbook/en/1.0/appendixB.html#working-with-classpath。
Jmeter做dubbo效能測試就可以用上面這種方法,繼承AbstractJavaSamplerClient類就可以。參考資料如下:
下面是一個實際使用的jython介面測試指令碼:
#!/usr/local/jython/bin/jython
# -*- coding: utf-8 -*-
# Author Rongzhong Xu 2016-09-06 wechat: pythontesting
"""
Name: dubbo.py
Tesed in python3.5
"""
from org.springframework.context.support import ClassPathXmlApplicationContext
from com.oppo.sso.model.request import SecurityRequest
context = ClassPathXmlApplicationContext("onekey-register-consumer.xml")
service = context.getBean("registerService")
request = SecurityRequest()
request.setMobile("13244448888")
request.setApplicationKey("test")
request.setCreateBy("127.0.0.1")
request.setCreateIP("127.0.0.1")
print("{0} {1} {0}".format("="*30, "Result("))
print(service.register(request))
result = service.register(request)
print(result.getResultCode())
print(result.getResultDesc())
效能測試支援
這裡對nGrinder不做入門介紹,相關資料請參考:測試工具nGrinder介紹
nGrinder管理庫的方式和grinder並不一樣。可以通過web操作,但是如果檔案較多的話,還是建議使用svn。
在nGrinder的web頁面點選”指令碼”,選中測試目標之後,裡面有個”TestRunner.py”之類的指令碼,在當前目前新建lib目錄,jar包和python庫檔案都可以扔到這裡,這樣nGrinder就可以訪問了。
上面demo的測試指令碼如下:
# -*- coding:utf-8 -*-
# A simple example using the HTTP plugin that shows the retrieval of a
# single page via HTTP.
#
# This script is automatically generated by ngrinder.
#
# @author admin
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from net.grinder.plugin.http import HTTPPluginControl
from java.util import Date
from HTTPClient import NVPair, Cookie, CookieModule
from org.springframework.context.support import ClassPathXmlApplicationContext
control = HTTPPluginControl.getConnectionDefaults()
# if you don`t want that HTTPRequest follows the redirection, please modify the following option 0.
# control.followRedirects = 1
# if you want to increase the timeout, please modify the following option.
control.timeout = 6000
test1 = Test(1, "127.0.0.1")
request1 = HTTPRequest()
# Set header datas
headers = [] # Array of NVPair
# Set param datas
params = [] # Array of NVPair
# Set cookie datas
cookies = [] # Array of Cookie
class TestRunner:
# initlialize a thread
def __init__(self):
test1.record(TestRunner.__call__)
grinder.statistics.delayReports=True
context = ClassPathXmlApplicationContext("demo.xml")
self.service = context.getBean("demoService")
def before(self):
request1.headers = headers
for c in cookies: CookieModule.addCookie(c, HTTPPluginControl.getThreadHTTPClientContext())
# test method
def __call__(self):
self.before()
result = self.service.sayHello("How are you!")
print result
jython英文教程: http://www.jython.org/jythonbook/en/1.0/
參考資料
python通過協議支援dubbo介面
以下方式支援dubbo的部分協議,序列化是個難點。
# git clone https://github.com/alibaba/dubbo.git dubbo
# cd dubbo/
# mvn clean install -Dmaven.test.skip
# cd dubbo-demo/dubbo-demo-provider/target/
# tar xzvf dubbo-demo-provider-2.5.4-SNAPSHOT-assembly.tar.gz
# cd dubbo-demo-provider-2.5.4-SNAPSHOT/bin
# ./start.sh
# cd /opt/code/dubbo-demo/dubbo-demo-consumer/target/
# tar xzvf dubbo-demo-provider-2.5.4-SNAPSHOT-assembly.tar.gz
# cd dubbo-demo-consumer-2.5.4-SNAPSHOT/bin
# ./start.sh
python環境安裝
# git clone https://github.com/dmall/dudubbo
# cd dudubbo/
# git checkout remotes/origin/feature/block-socket
# python3 setup.py install
python測試
# /opt/python3.5/bin/python3
Python 3.5.1 (default, May 19 2016, 11:47:26)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from dubbo import Dubbo
>>> from dubbo._model import Object
>>> config = { `classpath` : `/data/code/dubbo/dubbo-demo/dubbo-demo-api/target/dubbo-demo-api-2.5.4-SNAPSHOT.jar` }
>>> client = Dubbo(((`localhost`, 20880),), config, enable_heartbeat=True)
>>> q = client.getProxy(`com.alibaba.dubbo.demo.DemoService`)
>>> type(q)
<class `dubbo.dubbo.ServiceProxy`>
>>> q.sayHello("Test")
Connected to localhost:20880 successfully
`Hello Test, response form provider: 10.51.51.152:20880`
相關文章
- [雪峰磁針石部落格]介面測試面試題面試題
- [雪峰磁針石部落格]multi-mechanize效能測試工具
- [雪峰磁針石部落格]tesseractOCR識別工具及pytesseract
- [雪峰磁針石部落格]使用python3和flask構建RESTfulAPI(介面測試服務)PythonFlaskRESTAPI
- [雪峰磁針石部落格]軟體自動化測試初學者忠告
- [雪峰磁針石部落格]可愛的python測試開發庫Python
- [雪峰磁針石部落格]滲透測試簡介1滲透測試簡介
- [雪峰磁針石部落格]軟體測試專家工具包1web測試Web
- [雪峰磁針石部落格]python應用效能監控工具簡介Python
- [雪峰磁針石部落格]flask構建自動化測試平臺1-helloFlask
- [雪峰磁針石部落格]flask構建自動化測試平臺3-模板Flask
- [雪峰磁針石部落格]pythontkinter圖形工具樣式作業Python
- [雪峰磁針石部落格]flask構建自動化測試平臺7-新增google地圖FlaskGo地圖
- [雪峰磁針石部落格]pythonGUI工具書籍下載-持續更新PythonNGUI
- [雪峰磁針石部落格]python庫介紹-argparse:命令列選項及引數解析Python命令列
- [雪峰磁針石部落格]Bokeh資料視覺化工具1快速入門視覺化
- [雪峰磁針石部落格]python爬蟲cookbook1爬蟲入門Python爬蟲
- [雪峰磁針石部落格]資料倉儲快速入門教程1簡介
- [雪峰磁針石部落格]2018最佳ssh免費登陸工具
- [雪峰磁針石部落格]selenium自動化測試工具python筆試面試專案實戰5鍵盤操作Python筆試面試
- [雪峰磁針石部落格]python標準模組介紹-string:文字常量和模板Python
- [雪峰磁針石部落格]pythonGUI作業:tkinter控制元件改變背景色PythonNGUI控制元件
- [雪峰磁針石部落格]2018最佳python編輯器和IDEPythonIDE
- [雪峰磁針石部落格]python包管理工具:Conda和pip比較Python
- [雪峰磁針石部落格]python計算機視覺深度學習1簡介Python計算機視覺深度學習
- [雪峰磁針石部落格]2019-Python最佳資料科學工具庫Python資料科學
- [雪峰磁針石部落格]python計算機視覺深度學習2影像基礎Python計算機視覺深度學習
- 使用 MeterSphere 進行 Dubbo 介面測試
- [雪峰磁針石部落格]資料分析工具pandas快速入門教程4-資料匯聚
- [雪峰磁針石部落格]web開發工具flask中文英文書籍下載-持續更新WebFlask
- [雪峰磁針石部落格]大資料Hadoop工具python教程9-Luigi工作流大資料HadoopPythonUI
- [雪峰磁針石部落格]python網路作業:使用python的socket庫實現ICMP協議的pingPython協議
- [雪峰磁針石部落格]python人工智慧作業:Windows使用SAPI和tkinter用不到40行實現文字轉語音工具Python人工智慧WindowsAPI
- [雪峰磁針石部落格]計算機視覺opcencv工具深度學習快速實戰1人臉識別計算機視覺深度學習
- [雪峰磁針石部落格]計算機視覺opcencv工具深度學習快速實戰2opencv快速入門計算機視覺深度學習OpenCV
- [雪峰磁針石部落格]pythonopencv3例項(物件識別和擴增實境)1-影像幾何轉換PythonOpenCV物件
- [雪峰磁針石部落格]python3.7極速入門教程1安裝:Linux(Ubuntu18.04)及Windows上安裝AnacondaPythonLinuxUbuntuWindows
- 搭建 nGrinder 效能測試平臺並快速使用