为新操作员创建JUnit测试

radoneradone RapidMiner认证专家、会员职位:74大师
2018年11月编辑 帮助
你好,
我有以下简单的TestOperator和MyIOObject。
我正试图为这个操作符做JUnit测试。

TestOperator
公共类TestOperator扩展Operator {
//输入端口
protected InputPort inParam = getInputPorts().createPort("MyIOObject");

//输出端口
protected OutputPort outParam = getOutputPorts().createPort("MyIOObject");

public TestOperator(OperatorDescription描述){
超级(描述);
}

doWork()抛出operatoreexception {
//读取输入
myioobj = inParam.getData();

//增量值
ioObj。setValue(iobj . getvalue () + 1);

//输出
outParam.deliver (ioObj);
}
}

IO对象
公共类myiooobject扩展ResultObjectAdapter {
Private int value = -1;
public void setValue(int value) {
这一点。Value = Value;
}

int getValue() {
返回this.value;
}
}
我对JUnit测试的看法如下:
公共类CirclePixelsExtractorTest扩展TestCase {

@Test
testMeanValue()抛出operatoreexception {
//创建操作符
// ??????????????????????????????????????????????????????
// ????????????????????????1 ???????????????????????????
// ??????????????????????????????????????????????????????
OperatorDescription od = null;// (1) ??如何获得操作符描述??;
TestOperator ce = new TestOperator (od);

//创建IO输入数据
MyIOObject io = new MyIOObject();
io.setValue (5);

//提供IO数据作为输入

// ??????????????????????????????????????????????????????
// ????????????????????????2 ???????????????????????????
// ??????????????????????????????????????????????????????
ce.getInputPorts () .getPortByIndex(0)。//如何设置数据??;

//执行操作符
ce.doWork ();

//读取输出
MyIOObject io2 = ce.getOutputPorts().getPortByIndex(0).getData();
int res = io2.getValue();

/ /验证
assertequal (res);
}
}
请问,有人能帮我吗?
1)是否有任何简单的方法来创建我的操作符对象(TestOperator)?要使用构造函数,我缺少OperatorDescription,它的构造函数似乎相当复杂(需要额外的类)。
2)如何将IO对象(IO)设置为输入端口:ce.getInputPorts().getPortByIndex(0)


非常感谢你的建议。

radone
标记:

答案

  • radoneradone RapidMiner认证专家、会员职位:74大师
    解决。
    对于任何遇到同样问题的人:
    答案(1)
    OperatorDescription可以通过以下方法创建:
    private OperatorDescription createOperatorDescription() {
    GroupTree gt = GroupTree。findGroup (qName, null);
    返回新的OperatorDescription("key",
    类,gt, CirclePixelsExtractor.class
    .getClassLoader(), "iconName", null, null);
    }
    操作符的创建可以通过以下方式完成:
    TestOperator ce = new TestOperator(createOperatorDescription());
    回答2)
    //提供IO数据作为输入
    ce.getInputPorts () .getPortByIndex (0) .receive (io);
  • 费舍尔费舍尔 成员职位:439Maven
    你好,

    你不需要OperatorDescription。如果调用了RapidMiner.init(),则可以使用

    OperatorService.createOperator (YourOpClass.class)。

    最好的
    西蒙
  • vc126mvc126m 成员职位:9贡献我

    你好,我正试图为我的操作符编写Junit测试用例。下面是我的操作员代码。你能帮我写一下测试用例吗

    进口com.att.cmlp.rmcore.util.UtilV2;
    进口com.rapidminer.RapidMiner;
    进口com.rapidminer.example.Attribute;
    进口com.rapidminer.example.table.AttributeFactory;
    进口com.rapidminer.example.table.DataRow;
    进口com.rapidminer.example.table.DataRowFactory;
    进口com.rapidminer.example.table.MemoryExampleTable;
    进口com.rapidminer.operator。*;
    进口com.rapidminer.operator.nio.file.BufferedFileObject;
    进口com.rapidminer.operator.ports.OutputPort;
    进口com.rapidminer.parameter.ParameterType;
    进口com.rapidminer.parameter.ParameterTypeString;
    进口com.rapidminer.tools.GroupTree;
    进口com.rapidminer.tools.Ontology;
    进口com.rapidminer.tools.OperatorService;
    进口com.rapidminer.tools.Tools;
    进口org.apache.commons.httpclient.HttpClient;
    进口org.apache.commons.httpclient.HttpException;
    进口org.apache.commons.httpclient.HttpMethod;
    进口org.apache.commons.httpclient.HttpStatus;
    进口org.apache.commons.httpclient.methods.GetMethod;
    进口org.apache.commons.httpclient.methods.PostMethod;
    进口org.json.simple.JSONObject;
    进口org.json.simple.parser.JSONParser;
    进口org.json.simple.parser.ParseException;

    进口java.io.ByteArrayOutputStream;
    进口java.io.IOException;
    进口java.nio.charset.StandardCharsets;
    进口java.util.ArrayList;
    进口java.util.Base64;
    进口并不知道;

    / * *
    *由vc126m于8/16/2018创建。
    * /
    GetDatasetV2扩展操作符

    public static final String PARAMETER_DATASET_ENDPOINT_URL = "DATASET_GET_URL";
    public static final String PARAMETER_DATASET_KEY = "DATASET_KEY";

    public OutputPort changesOutputPort = getOutputPorts().createPort("dataset");
    public OutputPort fileOutputPort = getOutputPorts().createPort("file");

    public GetDatasetV2(OperatorDescription描述){
    超级(描述);
    }

    @Override
    doWork()抛出operatoreexception {
    super.doWork ();
    String datasetturl = "/datasetservice/v2/datasets";
    字符串dataset_key = getParameterAsString(PARAMETER_DATASET_KEY);

    尝试{
    UtilV2。createapiResponse =
    utiv2 . executeget (getLogger(), getParameters(), utiv2 . executeget ()CMLP_REST_HEADER_JSON_CONTENT_TYPE_VALUE,
    false, datasetturl + "/" + datasetKey);
    if (createapiResponse.getStatus() == HttpStatus.SC_OK) {

    getLogger().info("response: " + createapiResponse);
    JSONParser = new JSONParser();
    JSONObject = (JSONObject) parser.parse(createapiResponse.getResponse());
    getLogger().info("jResponseObject: " + jResponseObject);
    String DataSOURCEKey = null;
    if (jResponseObject.size() > 0) {

    getLogger().info("响应对象大小:" + jResponseObject.size());
    if (jResponseObject.get("datasourceKey") != null)
    DataSOURCEKey = (jResponseObject.get(" DataSOURCEKey ").toString());
    }
    尝试{
    UtilV2。createapiResponse2 =
    utiv2 . executeget (getLogger(), getParameters(), utiv2 . executeget ()CMLP_REST_HEADER_JSON_CONTENT_TYPE_VALUE,
    假,“datasourceservice / v2 /数据源”+ DataSOURCEKey + " /内容");

    if (createapiResponse2.getStatus() == HttpStatus.SC_OK) {
    getLogger().info("response: " + createapiResponse2);
    String[] dataArray = null;
    String[] jResponse = createapiResponse2.getResponse().split("\r\n");
    String[] s = jResponse[0].toString().split(",");
    Attribute[] outputattributes = new Attribute[s.length];
    For (int I = 0;I < s.length;我+ +)
    outputattributes[i] = AttributeFactory。createAttribute (s[我],Ontology.STRING);
    final MemoryExampleTable exampleTable = new MemoryExampleTable(outputattributes);
    如果(jResponse。长度> 0){
    For (int I = 1;i < jResponse.length;我+ +){

    DataRowFactory factory = new DataRowFactory。TYPE_DOUBLE_ARRAY ', ');
    getLogger().info("factory: " + factory);
    dataArray = jResponse[我].replaceAll ("\"","\\\""). toString () .split (",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
    DataRow row = factory。创建(dataArray outputattributes);
    getLogger().info(i+ "row>>>>>" + row);
    exampleTable.addDataRow(行);
    }
    changesOutputPort.deliver (exampleTable.createExampleSet ());
    }

    //文件输出端口
    String resp = createapiResponse2.getResponse();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    for (int i = 0;我< resp.length();我+ +)
    buffer.write (resp.charAt (i));
    BufferedFileObject result1 = new BufferedFileObject
    buffer.toByteArray ());
    fileOutputPort.deliver (result1)编写此表达式;

    } else {
    UtilV2.outputError (createapiResponse2 changesOutputPort);
    }
    } catch (HttpException) {
    e.printStackTrace ();
    } catch (IOException e) {
    e.printStackTrace ();
    }

    } else {
    UtilV2.outputError (createapiResponse changesOutputPort);
    }
    } catch (HttpException) {
    e.printStackTrace ();
    } catch (IOException e) {
    e.printStackTrace ();
    } catch (ParseException e) {
    e.printStackTrace ();
    } catch(异常e) {
    e.printStackTrace ();
    }

    }

    @Override
    getParameterTypes() {
    List parameterTypes = super.getParameterTypes();
    UtilV2.addDefaultProperties (parameterTypes假);

    // ParameterTypeString endpointurl = new ParameterTypeString(PARAMETER_DATASET_ENDPOINT_URL, "dataset register url", true);
    / / endpointurl.setDefaultValue(“/ datasetservice / v2 /数据集”);
    / / parameterTypes.add (endpointurl);
    ParameterTypeString dataset_key = new ParameterTypeString(PARAMETER_DATASET_KEY, "dataset key", true);
    / / datasetkey.setDefaultValue(“m09286_1516907114910_6157390775499062124”);
    parameterTypes.add (datasetkey);



    返回parameterTypes;
    }
    sgenzer
  • Pavithra_RaoPavithra_Rao 管理员,版主,员工,RapidMiner认证分析师,RapidMiner认证专家,会员职位:123RM数据科学家

    @vc126m

    是否可以共享这个扩展的java项目文件或.jar文件来测试它并在这里提供反馈或帮助?

    欢呼,

  • tftemmetftemme 管理员、员工、RapidMiner认证分析师、RapidMiner认证专家、RMResearcher、会员职位:164RM研究

    @vc126m

    当你想为你自己的操作符编写JUnitTests时,你必须在测试类中初始化RapidMiner本身。你可以通过调用:

    RapidMiner.setExecutionMode (ExecutionMode.COMMAND_LINE);
    RapidMiner.init ();

    然后,您可以使用前面提到的OperatorService来创建操作符的实例。

    GetDatasetV2 = OperatorService.createOperator(GetDatasetV2.class);

    有了这个实例,您可以实现任何您能想到的JUnit测试。如果你不太熟悉JUnit测试,你可以在网上找到很多教程(例如我使用的).

    您还可以做的是安装流程测试扩展在RapidMiner中使用。然后,你可以创建UnitTest进程(例如,你也可以将其存储在版本控制库中),并“运行并存储预期的结果”。之后,您可以运行“test process”来检查进程的结果是否发生了变化。

    希望能有所帮助

    费边

    sgenzer MartinLiebig jczogalla
登录注册置评。