2009-04-02 33 views
34

Tôi có một thử nghiệm JMeter với 2 nhóm chủ đề - đầu tiên là một chuỗi đơn (tạo ra một số hàng tồn kho) và thứ hai có nhiều chủ đề (mua tất cả hàng tồn kho). Tôi sử dụng BeanShell Assertions và XPath Extractors để phân tích giá trị trả về (là XML) và lưu các biến (chẳng hạn như các id của các mục cần mua).Làm thế nào để chuyển một biến từ một nhóm chủ đề khác trong JMeter

Nhưng, giá trị được tạo trong Nhóm chủ đề đầu tiên, cho dù được trích xuất thành các biến loại tiêu chuẩn ${jmeter} hoặc ${__BeanShell(vars.get("jmeter"))} loại vars, không có trong Nhóm chủ đề thứ hai. Có anyway để tạo ra một biến trong Thread Group đầu tiên và làm cho nó có thể nhìn thấy thứ hai?

Trả lời

48

Tôi không thể làm điều này với các biến (vì đó là các biến cục bộ cho từng chủ đề riêng lẻ). Tuy nhiên, tôi đã có thể giải quyết vấn đề này với các thuộc tính!

Một lần nữa, ThreadGroup đầu tiên của tôi làm tất cả các thiết lập, và tôi cần một số thông tin từ công việc đó để có sẵn cho mỗi chủ đề trong ThreadGroup thứ hai. Tôi có một xác nhận BeanShell trong ThreadGroup đầu tiên với những điều sau đây:

${__setProperty(storeid, ${storeid})}; 

$ {storeid} được trích xuất bằng trình trích xuất XPath. Các BeanShell Assertion hiện công cụ khác, như kiểm tra rằng StoreID được trả về từ các cuộc gọi trước đó vv

Dù sao, trong ThreadGroup thứ hai, tôi có thể sử dụng giá trị của "StoreID" bất động sản trong mẫu thêu với những điều sau:

${__property(storeid)} 

Hoạt động như một sự quyến rũ!

+2

Thuộc tính quá xấu không thể lưu trữ các đối tượng ...thực sự có vẻ như phương thức 'get()' và 'put()' vẫn có sẵn từ HashTable. Nó sẽ rất xấu nếu tôi lạm dụng thuộc tính jmeter để lưu trữ các giá trị đối tượng? Vấn đề của tôi là tôi muốn tất cả các chủ đề để chia sẻ cùng một đối tượng để tránh tạo nhiều đối tượng khi tôi chạy với rất nhiều chủ đề. – akostadinov

+0

cảm ơn tuyệt vời. Làm việc cho tôi như một sự quyến rũ! –

+0

Bắt tại đây. __setProperty được gọi trước khi kịch bản được truyền cho BeanShell. Vì vậy, nếu bạn đang cố gắng gán một giá trị cho một biến từ beanshell, bạn sẽ không thể nhận được giá trị –

4

Điều này là không thể trong JMeter, bởi vì nó không phải là hành vi khách hàng bình thường (chia sẻ các tham số giữa các chủ đề). Thay vì sử dụng một Thread-Group với Controllers:

Thread Group 
+ Create inventory 
+ + XPath 
+ Loop 
+ + Purchase inventory 
+0

Đối với các trường hợp kiểm tra không tầm thường, sử dụng bộ điều khiển logic có thể nhanh chóng trở nên rất tẻ nhạt (đến mức không sử dụng được). – Pacerier

3

Đây là một cách để thực hiện; làm theo các bước này và nó sẽ hoạt động, sau đó bạn có thể điều chỉnh nó theo nhu cầu của bạn! Biến không được chia sẻ giữa các chủ đề (JMeter gọi đây là một tính năng có thể :)). Nhưng tài sản là! Vì vậy, thiết lập biến của bạn như là một propery như vậy:

1) Nhấp vào thử nghiệm của bạn và cho phép 'Chạy các nhóm liên tục' -> điều này làm cho các nhóm chủ đề chạy theo thứ tự và không ngẫu nhiên. (sau đó bạn có thể điều chỉnh nó, nhưng bây giờ để nó hoạt động ..)

2) tạo một nhóm được gọi là 'thiết lập' chẳng hạn; trong nhóm chủ đề đó, hãy thêm một Trình lấy mẫu BeanShell với mã sau đây:

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery"); 

Bây giờ tài sản đã được thiết lập! Nếu giá trị mà bạn muốn để lưu trữ như một propery là một biến allready (User definded biến biến hoặc reqex ví dụ), bạn có thể làm:

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable")); 

3) thêm một testgroup 'test thực tế' ví dụ với một số chủ đề cao hơn 1; thêm một bài kiểm tra và thử nghiệm thêm một BeanShell Preprocessor với đoạn mã sau:

import org.apache.jmeter.util.JMeterUtils; 
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty")); 

Vì vậy, bây giờ bạn đã tạo một biến trong đó chủ đề được gọi là theNameOfYourNewProperty trong đó có giá trị của bạn theNameOfYourNewProperty sở hữu hệ thống.Trong thử nghiệm của bạn bây giờ bạn có thể truy cập vào nó thích:

${theNameOfYourNewProperty} 

Và nó sẽ làm việc cho mỗi thread, không chỉ các chủ đề đầu tiên ..

7

JMeter Plugins có Inter-Thread Communication cho mục đích này.

Có 2 phương pháp để sử dụng nó:

  • PostProcessor/Preprocessor
  • Chức năng __fifoPut__fifoPop

Theo tôi PostProcessor/Preprocessor là dễ dàng hơn để sử dụng.

+0

Lý do tôi thích câu trả lời được chấp nhận là tôi thấy rằng nếu tôi sử dụng phương pháp Giao tiếp giữa các chủ đề, tôi chỉ có thể "bật" hàng đợi một lần và sử dụng giá trị trong một mẫu đơn. Có lẽ tôi đã làm điều đó sai, nhưng tôi đã phải đặt PreProcessor trong một mẫu nhất định (Yêu cầu HTTP) và nếu mẫu đó trong vòng lặp nó sẽ chỉ hoạt động một lần trước khi thời gian ra cố gắng để đọc hàng đợi. – Joe

+1

@Joe đó là hành vi mong đợi theo tài liệu của Inter-Thread Communication. Nếu bạn muốn sử dụng biến được đặt vào hàng đợi FIFO nhiều lần, tôi nghĩ bạn có thể gán '$ {__ fifoPop (queue_name, var_name)}' vào biến thread-local trong [User Parameters] (http://jmeter.apache.org/usermanual) /component_reference.html#User_Parameters) preprocessor –

+0

@AndreyBotalov, Giải pháp này có mạnh không? Chủ đề đôi khi có thể làm những điều kỳ lạ, ví dụ một sợi chỉ đơn giản là có thể tụt hậu trong một vài phút trong khi các luồng khác đang chạy. ITC plugin có bất kỳ vấn đề với tình huống như vậy? – Pacerier

11

Theo tài liệu JMeter:

16,12 Sharing biến giữa các chủ đề và các nhóm chủ đề

biến là địa phương to a thread một bộ biến trong một thread không thể đọc trong khác. Điều này là do thiết kế. Đối với các biến có thể được xác định trước khi thử nghiệm bắt đầu, hãy xem Kiểm tra tham số (ở trên). Nếu giá trị không biết cho đến khi bắt đầu kiểm tra, có những lựa chọn khác nhau:

  1. Store biến như một tài sản - bất động sản mang tính toàn cầu cho các ví dụ JMeter
  2. Viết biến vào một tập tin và đọc lại chúng.
  3. Sử dụng không gian tên bsh.shared - xem 16.8.2 Sharing Variables
  4. Viết lớp Java của riêng bạn

Một cách khác để vượt qua biến giữa các chủ đề được sử dụng jmeter-plugins như mentioned by Andrey Botalov below.

Nhưng tôi thấy rằng hơi khó hiểu khi sử dụng nó lần đầu tiên nhưng nó cho phép kiểm soát hoàn toàn biến trong khi truyền từ chuỗi này sang luồng khác. theo ví dụ của tôi với việc sử dụng BeanShell và bạn thấy cách dễ dàng là:

Project stucture Tiếp tham khảo các phần trong bức tranh dưới đây:

(1,1) Ở đây tôi tạo ra biến tùy chỉnh trong User Defined biến (hoặc bạn có thể làm nó với BSF Proccessor - khuyết tật trong ví dụ này (1,2))

(2,1) (2,4) tôi sử dụng thành công biến trong chủ đề đầu tiên - không có gì đặc biệt :)

(2,2) Added BeanShell PostProcessor và tùy biến tôi

(2.3) Đã thêm nó vào hàng đợi

(3.1) Trong chuỗi thứ hai - biến được lấy từ hàng đợi - với bất kỳ tên nào bạn muốn.Nhưng hãy cẩn thận, sử dụng một cách khôn ngoan Timeout, bởi vì thread này sẽ chờ đến khi kết thúc trước đó để nó có thể nhận được biến đổi (thử nghiệm với một số phản ứng dài)

(3.2) (3.3) (3,4) Lặp lại các bước sử dụng và sửa đổi biến

(3.5) biến được gửi một lần nữa trong hàng đợi mới - vì vậy cung cấp tên mới cho nó

(4.1) (4.2) (4.3) Grabbed biến đổi từ hàng đợi mới hoạt động như quyến rũ

Cảnh báo

  1. Nếu bạn thêm nhiều chủ đề hơn, hãy thêm một số truy cập vào nhóm chủ đề với biến và thêm tên biến này vào tên hàng đợi - làm tương tự trong nhóm chủ đề nơi bạn cố bắt hàng đợi để hàng đợi sẽ có tên duy nhất cho mỗi chủ đề (viết nếu bạn cần một số giải thích rõ ràng hơn)

  2. Nếu bạn có nhiều hơn một http Yêu cầu trong một nhóm chủ đề, sau đó thêm bộ xử lý trước giao tiếp chuỗi làm con cuối cùng (hoặc khác nếu bạn muốn đạt được một số điều tùy chỉnh)

Phát, sửa đổi, tùy chỉnh để có kết quả tốt nhất :) Thêm chủ đề khác có thể dẫn đến hành vi không mong muốn để bạn d là thận trọng.

Information about project structure

1

Chúng ta hãy đưa ra một chủ đề một cuộc sống thứ hai :) Một trong nhiều cách để chuyển biến giữa các chủ đề là viết/đọc để nộp. Passing variables between threads

1

Một giải pháp khác là sử dụng Máy chủ bảng đơn giản để quản lý tập dữ liệu. Tính năng này đã thêm 1,2 Plugin JMeter.

"Ý tưởng chính là sử dụng một máy chủ http nhỏ trong JMeter Plugins để quản lý các tập tin dữ liệu với các lệnh đơn giản để được/thêm dòng dữ liệu trong file"

Nhìn vào tài liệu: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Kính trọng.

+0

Hmm, thay vì sử dụng HTTP làm proxy, tại sao không kết nối trực tiếp với cơ sở dữ liệu? – Pacerier

5

Tôi thấy rằng tôi tin rằng đây là cách đơn giản nhất để hoàn thành công việc này.

Sử dụng

Bean Shell PostProcessor 

để đặt biến (http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value"); 

HOẶC nếu bạn đang đọc từ một biến

import org.apache.jmeter.util.JMeterUtils; 
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE")); 

Và sau đó từ nhóm chủ đề khác, hãy đọc qua (http://jmeter.apache.org/usermanual/functions.html#__property)

${__property(PC_CREATED_PROMO_CODE)} 
Các vấn đề liên quan