Jmeter源码学习系列:用GUI的基本操作
2018-01-08 18:42
183 查看
Jmeter源码学习系列:用GUI的基本操作
今天简单的看了一下GUI基本操作的代码,比如添加,保存等基本操作,希望对大家有所帮助。
添加删除:
添加选中的element到左边的tree中: 右键点击->Add
jmeter/src/core/org.apache.jmeter/gui/action/AddToTree.java
先确定需要添加到tree中的信息以及现在的tree
public void doAction(ActionEvent e) {
GuiPackage guiPackage = GuiPackage.getInstance();
try {
guiPackage.updateCurrentNode();
TestElement testElement = guiPackage.createTestElement(((JComponent) e.getSource()).getName());
JMeterTreeNode parentNode = guiPackage.getCurrentNode();
JMeterTreeNode node = guiPackage.getTreeModel().addComponent(testElement, parentNode);
guiPackage.getNamingPolicy().nameOnCreation(node);
guiPackage.getMainFrame().getTree().setSelectionPath(new TreePath(node.getPath()));jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行添加操作(这段代码是common调用,后续不再贴了)
先确认要删除以及现在的tree
jmeter/src/core/org.apache.jmeter/gui/action/Remove.java
public void doAction(ActionEvent e) {
先获取是否确认删除
int isConfirm = SKIP_CONFIRM ? JOptionPane.YES_OPTION :
JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
JMeterUtils.getResString("remove_confirm_msg"),// $NON-NLS-1$
JMeterUtils.getResString("remove_confirm_title"), // $NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
选择确认是否删除
if (isConfirm == JOptionPane.YES_OPTION) {
// TODO - removes the nodes from the CheckDirty map - should it be done later, in case some can't be removed?
ActionRouter.getInstance().actionPerformed(new ActionEvent(e.getSource(), e.getID(), ActionNames.CHECK_REMOVE));
GuiPackage guiPackage = GuiPackage.getInstance();
JMeterTreeNode[] nodes = guiPackage.getTreeListener().getSelectedNodes();
TreePath newTreePath = // Save parent node for later
guiPackage.getTreeListener().removedSelectedNode();
for (int i = nodes.length - 1; i >= 0; i--) {
removeNode(nodes[i]);
}jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行删除操作
载入存储:
打开已有的文件,File->Open
jmeter/src/core/org.apache.jmeter/gui/action/Load.java
从磁盘读取正确格式的文件,进行一下文件格式检查以及载入方式检查
public void doActionAfterCheck(final ActionEvent e) {
final JFileChooser chooser = FileDialoger.promptToOpenFile(new String[] { ".jmx" }); //$NON-NLS-1$
if (chooser == null) {
return;
}
final File selectedFile = chooser.getSelectedFile();
if (selectedFile != null) {
final boolean merging = e.getActionCommand().equals(ActionNames.MERGE);
// We must ask the user if it is ok to close current project
if (!merging) { // i.e. it is OPEN
if (!Close.performAction(e)) {
return;
}
}
loadProjectFile(e, selectedFile, merging);
}
}jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行载入操作
对现有测试计划进行保存
jmeter/src/core/org.apache.jmeter/gui/action/Save.java
public void doAction(ActionEvent e) throws IllegalUserActionException {
HashTree subTree;
是否保存整个测试计划,Jmeter支持部分保存
boolean fullSave = false; // are we saving the whole tree?
if (!commands.contains(e.getActionCommand())) {
throw new IllegalUserActionException("Invalid user command:" + e.getActionCommand());
}
。。。。
确认是否保存到一个已存在的文件
String updateFile = GuiPackage.getInstance().getTestPlanFile();
if (!ActionNames.SAVE.equals(e.getActionCommand()) || updateFile == null) {
JFileChooser chooser = FileDialoger.promptToSaveFile(updateFile == null ? GuiPackage.getInstance().getTreeListener()
.getCurrentNode().getName()
+ JMX_FILE_EXTENSION : updateFile);
if (chooser == null) {
return;
}
updateFile = chooser.getSelectedFile().getAbsolutePath();
// Make sure the file ends with proper extension
if(FilenameUtils.getExtension(updateFile).isEmpty()) {
updateFile = updateFile + JMX_FILE_EXTENSION;
}
// Check if the user is trying to save to an existing file
File f = new File(updateFile);
if(f.exists()) {
int response = JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
JMeterUtils.getResString("save_overwrite_existing_file"), // $NON-NLS-1$
JMeterUtils.getResString("save?"), // $NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (response == JOptionPane.CLOSED_OPTION || response == JOptionPane.NO_OPTION) {
return ; // Do not save, user does not want to overwrite
}
}
if (!e.getActionCommand().equals(ActionNames.SAVE_AS)) {
GuiPackage.getInstance().setTestPlanFile(updateFile);
}
}
对保存的文件做一个backup,保存完之后删除backup
// backup existing file according to jmeter/user.properties settings
List<File> expiredBackupFiles = EMPTY_FILE_LIST;
File fileToBackup = new File(updateFile);
try {
expiredBackupFiles = createBackupFile(fileToBackup);
} catch (Exception ex) {
log.error("Failed to create a backup for {}", fileToBackup, ex); //$NON-NLS-1$
}
try {
convertSubTree(subTree);
} catch (Exception err) {
if (log.isWarnEnabled()) {
log.warn("Error converting subtree. {}", err.toString());
}
}
try (FileOutputStream ostream = new FileOutputStream(updateFile)){
SaveService.saveTree(subTree, ostream);
if (fullSave) { // Only update the stored copy of the tree for a full save
FileServer.getFileServer().setScriptName(new File(updateFile).getName());
subTree = GuiPackage.getInstance().getTreeModel().getTestPlan(); // refetch, because convertSubTree affects it
if (isWorkbenchSaveable()) {
HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
subTree.add(workbench);
}
ActionRouter.getInstance().doActionNow(new ActionEvent(subTree, e.getID(), ActionNames.SUB_TREE_SAVED));
}
// delete expired backups : here everything went right so we can
// proceed to deletion
for (File expiredBackupFile : expiredBackupFiles) {
try {
FileUtils.deleteQuietly(expiredBackupFile);
} catch (Exception ex) {
log.warn("Failed to delete backup file, {}", expiredBackupFile); //$NON-NLS-1$
}
}
} catch(RuntimeException ex) {
throw ex;
}
catch (Exception ex) {
log.error("Error saving tree.", ex);
throw new IllegalUserActionException("Couldn't save test plan to file: " + updateFile, ex);
}
GuiPackage.getInstance().updateCurrentGui();
}
jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行保存操作
启动测试计划:
启动测试计划: 运行->启动
jmeter/src/core/org.apache.jmeter/gui/action/Start.java
确认运行的模式:
public void doAction(ActionEvent e) {
if (e.getActionCommand().equals(ActionNames.ACTION_START)) {
popupShouldSave(e);
startEngine(false);jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行运行操作
jmeter/src/core/org.apache.jmeter/Threads/JMeterThread.java
进行运行前的初始化
jmeter/src/core/org.apache.jmeter/Threads/ThreadGroup.java
创建线程
jmeter/src/core/org.apache.jmeter/engine/StandardJMeterEngine.java
今天简单的看了一下GUI基本操作的代码,比如添加,保存等基本操作,希望对大家有所帮助。
添加删除:
添加选中的element到左边的tree中: 右键点击->Add
jmeter/src/core/org.apache.jmeter/gui/action/AddToTree.java
先确定需要添加到tree中的信息以及现在的tree
public void doAction(ActionEvent e) {
GuiPackage guiPackage = GuiPackage.getInstance();
try {
guiPackage.updateCurrentNode();
TestElement testElement = guiPackage.createTestElement(((JComponent) e.getSource()).getName());
JMeterTreeNode parentNode = guiPackage.getCurrentNode();
JMeterTreeNode node = guiPackage.getTreeModel().addComponent(testElement, parentNode);
guiPackage.getNamingPolicy().nameOnCreation(node);
guiPackage.getMainFrame().getTree().setSelectionPath(new TreePath(node.getPath()));jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行添加操作(这段代码是common调用,后续不再贴了)
private void performAction(final ActionEvent e) { String actionCommand = e.getActionCommand(); try { try { GuiPackage.getInstance().updateCurrentGui(); } catch (Exception err){ log.error("performAction({}) updateCurrentGui() on{} caused", actionCommand, e, err); JMeterUtils.reportErrorToUser("Problem updating GUI - see log file for details"); } for (Command c : commands.get(actionCommand)) { try { preActionPerformed(c.getClass(), e); c.doAction(e); postActionPerformed(c.getClass(), e); } public void actionPerformed(final ActionEvent e) { SwingUtilities.invokeLater(() -> performAction(e)); }从左边tree中删除对应的element:右键点击->Delete
先确认要删除以及现在的tree
jmeter/src/core/org.apache.jmeter/gui/action/Remove.java
public void doAction(ActionEvent e) {
先获取是否确认删除
int isConfirm = SKIP_CONFIRM ? JOptionPane.YES_OPTION :
JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
JMeterUtils.getResString("remove_confirm_msg"),// $NON-NLS-1$
JMeterUtils.getResString("remove_confirm_title"), // $NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
选择确认是否删除
if (isConfirm == JOptionPane.YES_OPTION) {
// TODO - removes the nodes from the CheckDirty map - should it be done later, in case some can't be removed?
ActionRouter.getInstance().actionPerformed(new ActionEvent(e.getSource(), e.getID(), ActionNames.CHECK_REMOVE));
GuiPackage guiPackage = GuiPackage.getInstance();
JMeterTreeNode[] nodes = guiPackage.getTreeListener().getSelectedNodes();
TreePath newTreePath = // Save parent node for later
guiPackage.getTreeListener().removedSelectedNode();
for (int i = nodes.length - 1; i >= 0; i--) {
removeNode(nodes[i]);
}jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行删除操作
载入存储:
打开已有的文件,File->Open
jmeter/src/core/org.apache.jmeter/gui/action/Load.java
从磁盘读取正确格式的文件,进行一下文件格式检查以及载入方式检查
public void doActionAfterCheck(final ActionEvent e) {
final JFileChooser chooser = FileDialoger.promptToOpenFile(new String[] { ".jmx" }); //$NON-NLS-1$
if (chooser == null) {
return;
}
final File selectedFile = chooser.getSelectedFile();
if (selectedFile != null) {
final boolean merging = e.getActionCommand().equals(ActionNames.MERGE);
// We must ask the user if it is ok to close current project
if (!merging) { // i.e. it is OPEN
if (!Close.performAction(e)) {
return;
}
}
loadProjectFile(e, selectedFile, merging);
}
}jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行载入操作
对现有测试计划进行保存
jmeter/src/core/org.apache.jmeter/gui/action/Save.java
public void doAction(ActionEvent e) throws IllegalUserActionException {
HashTree subTree;
是否保存整个测试计划,Jmeter支持部分保存
boolean fullSave = false; // are we saving the whole tree?
if (!commands.contains(e.getActionCommand())) {
throw new IllegalUserActionException("Invalid user command:" + e.getActionCommand());
}
。。。。
确认是否保存到一个已存在的文件
String updateFile = GuiPackage.getInstance().getTestPlanFile();
if (!ActionNames.SAVE.equals(e.getActionCommand()) || updateFile == null) {
JFileChooser chooser = FileDialoger.promptToSaveFile(updateFile == null ? GuiPackage.getInstance().getTreeListener()
.getCurrentNode().getName()
+ JMX_FILE_EXTENSION : updateFile);
if (chooser == null) {
return;
}
updateFile = chooser.getSelectedFile().getAbsolutePath();
// Make sure the file ends with proper extension
if(FilenameUtils.getExtension(updateFile).isEmpty()) {
updateFile = updateFile + JMX_FILE_EXTENSION;
}
// Check if the user is trying to save to an existing file
File f = new File(updateFile);
if(f.exists()) {
int response = JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
JMeterUtils.getResString("save_overwrite_existing_file"), // $NON-NLS-1$
JMeterUtils.getResString("save?"), // $NON-NLS-1$
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (response == JOptionPane.CLOSED_OPTION || response == JOptionPane.NO_OPTION) {
return ; // Do not save, user does not want to overwrite
}
}
if (!e.getActionCommand().equals(ActionNames.SAVE_AS)) {
GuiPackage.getInstance().setTestPlanFile(updateFile);
}
}
对保存的文件做一个backup,保存完之后删除backup
// backup existing file according to jmeter/user.properties settings
List<File> expiredBackupFiles = EMPTY_FILE_LIST;
File fileToBackup = new File(updateFile);
try {
expiredBackupFiles = createBackupFile(fileToBackup);
} catch (Exception ex) {
log.error("Failed to create a backup for {}", fileToBackup, ex); //$NON-NLS-1$
}
try {
convertSubTree(subTree);
} catch (Exception err) {
if (log.isWarnEnabled()) {
log.warn("Error converting subtree. {}", err.toString());
}
}
try (FileOutputStream ostream = new FileOutputStream(updateFile)){
SaveService.saveTree(subTree, ostream);
if (fullSave) { // Only update the stored copy of the tree for a full save
FileServer.getFileServer().setScriptName(new File(updateFile).getName());
subTree = GuiPackage.getInstance().getTreeModel().getTestPlan(); // refetch, because convertSubTree affects it
if (isWorkbenchSaveable()) {
HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
subTree.add(workbench);
}
ActionRouter.getInstance().doActionNow(new ActionEvent(subTree, e.getID(), ActionNames.SUB_TREE_SAVED));
}
// delete expired backups : here everything went right so we can
// proceed to deletion
for (File expiredBackupFile : expiredBackupFiles) {
try {
FileUtils.deleteQuietly(expiredBackupFile);
} catch (Exception ex) {
log.warn("Failed to delete backup file, {}", expiredBackupFile); //$NON-NLS-1$
}
}
} catch(RuntimeException ex) {
throw ex;
}
catch (Exception ex) {
log.error("Error saving tree.", ex);
throw new IllegalUserActionException("Couldn't save test plan to file: " + updateFile, ex);
}
GuiPackage.getInstance().updateCurrentGui();
}
jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行保存操作
启动测试计划:
启动测试计划: 运行->启动
jmeter/src/core/org.apache.jmeter/gui/action/Start.java
确认运行的模式:
public void doAction(ActionEvent e) {
if (e.getActionCommand().equals(ActionNames.ACTION_START)) {
popupShouldSave(e);
startEngine(false);jmeter/src/core/org.apache.jmeter/gui/action/ActionRouter.java
进行运行操作
jmeter/src/core/org.apache.jmeter/Threads/JMeterThread.java
进行运行前的初始化
jmeter/src/core/org.apache.jmeter/Threads/ThreadGroup.java
创建线程
private JMeterThread makeThread( 运行线程 private JMeterThread startNewThread(ListenerNotifier notifier, ListedHashTree threadGroupTree, StandardJMeterEngine engine, int threadNum, final JMeterContext context, long now, int delay) { JMeterThread jmThread = makeThread(notifier, threadGroupTree, engine, threadNum, context); scheduleThread(jmThread, now); // set start and end time jmThread.setInitialDelay(delay); Thread newThread = new Thread(jmThread, jmThread.getThreadName()); registerStartedThread(jmThread, newThread); newThread.start(); return jmThread; } 运行并写入日志 public void start(int groupNum, ListenerNotifier notifier, ListedHashTree threadGroupTree, StandardJMeterEngine engine) { this.running = true; this.groupNumber = groupNum; this.notifier = notifier; this.threadGroupTree = threadGroupTree; int numThreads = getNumThreads(); int rampUpPeriodInSeconds = getRampUp(); float perThreadDelayInMillis = (float) (rampUpPeriodInSeconds * 1000) / (float) getNumThreads(); delayedStartup = isDelayedStartup(); // Fetch once; needs to stay constant log.info("Starting thread group... number={} threads={} ramp-up={} perThread={} delayedStart={}", groupNumber, numThreads, rampUpPeriodInSeconds, perThreadDelayInMillis, delayedStartup); if (delayedStartup) { threadStarter = new Thread(new ThreadStarter(notifier, threadGroupTree, engine), getName()+"-ThreadStarter"); threadStarter.setDaemon(true); threadStarter.start(); // N.B. we don't wait for the thread to complete, as that would prevent parallel TGs } else { long now = System.currentTimeMillis(); // needs to be same time for all threads in the group final JMeterContext context = JMeterContextService.getContext(); for (int threadNum = 0; running && threadNum < numThreads; threadNum++) { startNewThread(notifier, threadGroupTree, engine, threadNum, context, now, (int)(threadNum * perThreadDelayInMillis)); } } log.info("Started thread group number {}", groupNumber); }运行引擎
jmeter/src/core/org.apache.jmeter/engine/StandardJMeterEngine.java
相关文章推荐
- Git学习系列之Git基本操作拉取项目(图文详解)
- TortoiseGit学习系列之TortoiseGit基本操作将提交到本地的项目推送到在线仓库(图文详解)
- TortoiseGit学习系列之TortoiseGit基本操作拉取项目(图文详解)
- 数据结构入门学习系列-5(链表的基本操作算法)
- hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
- Opencv2系列学习笔记1(图像的基本操作)
- Spark RDD/Core 编程 API入门系列 之rdd实战(rdd基本操作实战及transformation和action流程图)(源码)(三)
- TensorFlow学习笔记之四——源码分析之基本操作
- php基础系列:从用户登录处理程序学习mysql扩展基本操作
- SVN系列学习(三)-TortoiseSVN的基本操作
- openCV学习笔记(二)---openCV系列基本操作(2)
- Git学习系列之Git基本操作克隆项目(图文详解)
- 【Python学习系列二十一】pandas库基本操作
- TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解)
- JMeter GUI基本操作
- Jmeter源码学习系列:从Jmeter.properties加载配置并启动Jmeter
- Git学习系列之Git基本操作提交项目(图文详解)
- 【转】hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
- openCV学习笔记(二)---openCV系列基本操作
- 18、HTTP基本操作及源码编译安装 学习笔记