fitnesse的wiki页面,只能从上往下依次执行,无法按照条件选择性执行。因为,需要通过修改源java代码的方式实现。当if返回的结果是true,则执行下一行语句直到endif的区域;当if返回的结果是false,则不会执行下一行语句直到endif的区域。修改的文件以及代码如下。
HtmlSlimTestSystem.java
// begin
import org.htmlparser.Node;
// end
获取table指定row的关键字,例如script、ensure等
// begin
private String getKeyWordFromTableRow(Node tr){
NodeList tds = tr.getChildren();
String str = "";
for(int k = 0; k < tds.size(); k++){
Node td = tds.elementAt(k);
if(td instanceof TableColumn){
if(td.getChildren()!=null){
str = ((TableColumn) td).getChild(0).toString().split(":")[1].trim();
}
break;
}
}
return str;
}
//end
根据if条件返回的true或者false,来限定endif表是否要执行,如果返回为true则执行,返回为false则不执行。
@Override
protected void processAllTablesOnPage(TestPage pageToTest) throws TestExecutionException {
List<SlimTable> allTables = createSlimTables(pageToTest);
boolean isSuiteTearDownPage = PageData.SUITE_TEARDOWN_NAME.equals(pageToTest.getName());
if (allTables.isEmpty()) {
String html = createHtmlResults(START_OF_TEST, END_OF_TEST);
testOutputChunk(html);
} else {
// begin
boolean executeNext = true; //下个table是否需要执行
// end
for (int index = 0; index < allTables.size(); index++) {
SlimTable theTable = allTables.get(index);
SlimTable startWithTable = (index == 0) ? START_OF_TEST : theTable;
SlimTable nextTable = (index + 1 < allTables.size()) ? allTables.get(index + 1) : END_OF_TEST;
try {
// processTable(theTable, isSuiteTearDownPage);
// begin
if(executeNext){
executeNext = processTable(theTable, isSuiteTearDownPage);
}else{
executeNext = true;
}
// end
} catch (SyntaxError e) {
String tableName = theTable.getTable().getCellContents(0, 0);
theTable.getTable().updateContent(0, 0, SlimTestResult.error(String.format("<strong> %s: Bad table! %s</strong>", tableName, e.getMessage())));
getTestContext().incrementErroredTestsCount();
}
String html = createHtmlResults(startWithTable, nextTable);
testOutputChunk(html);
}
}
}
源代码中根据nodeList的内容进行table处理,如果要用if-endif条件,必定要重新分表处理。
private List<SlimTable> createSlimTables(TestPage pageToTest) {
NodeList nodeList = makeNodeList(pageToTest);
// begin
List<Node> rebuildTableList = new ArrayList<Node>();
for (int i=0;i<nodeList.size();i++) {
Node node = nodeList.elementAt(i);
if (node instanceof TableTag) {
Node scriptNode = null;
//进行node分隔处理
NodeList children = node.getChildren();
TableTag tag = new TableTag();
tag.setChildren(new NodeList());
for(int j = 0; j < children.size(); j++){
Node tr = children.elementAt(j);
if(tr instanceof TableRow){
String keyWord = getKeyWordFromTableRow(tr);
if(keyWord.equalsIgnoreCase("script")) {
scriptNode = tr;
tag.getChildren().add(scriptNode);
}else if(keyWord.equalsIgnoreCase("comment")){
rebuildTableList.add(node);
break;
}else if(keyWord.equalsIgnoreCase("if")){
if(tag.getChildren().size()>1)
rebuildTableList.add(tag);
tag = new TableTag();
tag.setChildren(new NodeList());
tag.getChildren().add(scriptNode);
tag.getChildren().add(tr);
rebuildTableList.add(tag);
tag = new TableTag();
tag.setChildren(new NodeList());
tag.getChildren().add(scriptNode);
}else if(keyWord.equalsIgnoreCase("endif")){
tag.getChildren().add(tr);
rebuildTableList.add(tag);
tag = new TableTag();
tag.setChildren(new NodeList());
tag.getChildren().add(scriptNode);
}else{
tag.getChildren().add(tr);
}
}
if(j==children.size()-1&&tag.getChildren().size()>1){
rebuildTableList.add(tag);
}
}
nodeList.remove(node);
i--;
}else{
rebuildTableList.add(node);
nodeList.remove(node);
i--;
}
}
for(Node node:rebuildTableList){
nodeList.add(node);
}
// end
tableScanner = new HtmlTableScanner(nodeList);
return createSlimTables(tableScanner);
}
ScriptTable.java
添加if和endif关键字的支撑,if功能沿用ensure,endif功能延用note。
// begin
protected String getIfKeyword() {
return "if";
}
protected String getEndIfKeyword() {
return "endif";
}
// end
protected List instructionsForRow(int row)
// begin
else if(firstCell.equalsIgnoreCase(getIfKeyword()))
assertions = ensure(row);
else if(firstCell.equalsIgnoreCase(getEndIfKeyword()))
assertions = note(row);
// end
SlimTestSystem.java
processTable原本无返回值,这里需要返回true或者false。
protected boolean processTable(SlimTable table, boolean isSuiteTearDownPage) throws TestExecutionException {
List<SlimAssertion> assertions = table.getAssertions();
final Map<String, Object> instructionResults;
if (stopTestCalled && !table.isTearDown()) {
instructionResults = Collections.emptyMap();
} else {
boolean tearDownOfAlreadyStartedTest = stopTestCalled && table.isTearDown();
if (stopSuiteCalled && !isSuiteTearDownPage && !tearDownOfAlreadyStartedTest) {
instructionResults = Collections.emptyMap();
} else {
instructionResults = slimClient.invokeAndGetResponse(SlimAssertion.getInstructions(assertions));
}
}
evaluateTables(assertions, instructionResults);
// begin
String keyWord = table.getTable().getCellContents(0, 1).trim();
if(keyWord.toLowerCase().contains("if")){
for(String key:instructionResults.keySet()){
if(instructionResults.get(key).equals("false"))
return false;
}
}
return true;
// end
}