为新的操作人员创建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 description) {
超级(描述);


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

//增加值
ioObj。setValue(ioObj.getValue() + 1);

//输出
outParam.deliver (ioObj);



IO对象
公共类MyIOObject扩展ResultObjectAdapter {
私有int值= -1;
setValue(int值){
这一点。价值=价值;


公共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可以通过以下方法创建:
    createOperatorDescription() {
    GroupTree gt = GroupTree。findGroup (qName, null);
    return new OperatorDescription("key",
    CirclePixelsExtractor.class, 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于2018年8月16日创建。
    * /
    公共类GetDatasetV2扩展操作符{

    PARAMETER_DATASET_ENDPOINT_URL = "DATASET_GET_URL";
    PARAMETER_DATASET_KEY = "DATASET_KEY";

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

    GetDatasetV2(OperatorDescription description) {
    超级(描述);


    @Override
    doWork()抛出operatoreexception {
    super.doWork ();
    String datasetservice = "/datasetservice/v2/datasets";
    String datasetKey = getParameterAsString(PARAMETER_DATASET_KEY);

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

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

    getLogger().info("响应对象大小:" + jResponseObject.size()));
    if (jResponseObject.get("datasourceKey") != null)
    DataSOURCEKey = (jResponseObject.get(" DataSOURCEKey ").toString());

    尝试{
    UtilV2。APIResponse createapiResponse2 =
    UtilV2. executeget (getLogger(), getParameters(), UtilV2. executegetCMLP_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(",");
    属性[]outputattributes = new属性[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(DataRowFactory。TYPE_DOUBLE_ARRAY ', ');
    getLogger().info("factory: " + factory);
    dataArray = jResponse[我].replaceAll ("\"","\\\""). toString () .split (",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
    数据行=工厂。创建(dataArray outputattributes);
    getLogger().info(i+ "row>>>>>" + row);
    exampleTable.addDataRow(行);

    changesOutputPort.deliver (exampleTable.createExampleSet ());


    //文件输出端口
    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)编写此表达式;

    }其他{
    UtilV2.outputError (createapiResponse2 changesOutputPort);

    } catch (HttpException e) {
    e.printStackTrace ();
    } catch (IOException e) {
    e.printStackTrace ();


    }其他{
    UtilV2.outputError (createapiResponse changesOutputPort);

    } catch (HttpException e) {
    e.printStackTrace ();
    } catch (IOException e) {
    e.printStackTrace ();
    } catch (ParseException e) {
    e.printStackTrace ();
    } catch(异常e) {
    e.printStackTrace ();




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

    // ParameterTypeString endpointurl = new ParameterTypeString(PARAMETER_DATASET_ENDPOINT_URL, "数据集注册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 GetDatasetV2 = OperatorService.createOperator(GetDatasetV2.class);

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

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

    希望这能有所帮助

    费边

    sgenzer MartinLiebig jczogalla
登录注册置评。