您的位置:首页 > 产品设计 > UI/UE

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调用,后续不再贴了)
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jmeter 源码