fitnesse二次开发-if功能

本文介绍了如何对Fitnesse进行二次开发,以实现wiki页面中的If条件控制功能。通过修改HtmlSlimTestSystem.java、ScriptTable.java和SlimTestSystem.java的源代码,使得当If条件为真时执行相应语句,否则跳过直到遇到Endif。具体改动包括在HtmlSlimTestSystem.java中处理关键字判断,ScriptTable.java中添加If和Endif支持,并在SlimTestSystem.java中修改processTable方法以返回执行状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值