jcunit's blog

JCUnitの開発日誌(ログ)です。"その時点での"JCUnit作者の理解や考え、開発状況を日本語で書きます。

JCUnitはPICTよりも制約の取り扱いに長けている(ようだ)

githubにあるPICTレポジトリで報告されているが、PICTには以下のモデルからのテストスイート生成が終わらないという問題がある。

Eingangskanal: EVA_Anlageberatung, EVA_Order, EVA_Sonderweg, EVA_Sparplan, EVA_Neuemission, EVA_Direkteinstieg, HOST_T19000, HOST_T19001, HOST_T19901, HOST_T19750, HOST_T28900, Onlinebanking_PC, Onlinebanking_MSB, Onlinebanking_Neuemission_PC, Onlinebanking_Neuemission_MSB, Onlinebanking_Tablet_PC, Infobroker, commerzbank_de_pib
Finanzinstrument: Aktie, Unstrukturierte_Anleihe, strukturierte_Anleihe, Inv.Fonds, OIF, Zertifikat, Optionsschein, Xetra_Gold_ETC, EMISID
Produktzyklus: Neuemission_Information, Neuemission_offen, Neuemission_geschlossen, Neuemission_abgerechnet, Sekundaermarkt, n/a
Dienstleistungsart: Anlageberatung, beratungsfreies_Geschaeft, n/a
Orderart: Kauf(Beratungsdatum_gueltig), Kauf_(ohne_Beratungsdatum), Verkauf, aenderung, Streichung, Storno, Berichtigungsauftrag, n/a
Initiator: Kunde, Bank, n/a
Auftragserteilung: telefonisch, persoenlich, schriftlich, Haustuergeschaeft, n/a
Bereitstellungsdokumente: Beratungsprotokoll_Kunde, Beratungsprotokoll_Interessent, Beratungsprotokoll_Potenzial, Nachtraeglicher_KID-Versand, n/a
UDAL-Status: Normalbetrieb, Back_up-Betrieb, PRIIP,ohne_KID, WKN_nicht_vorhanden, WKN_inaktiv/geloescht, defektes_Dokument, Virus, non-PRIIP_auf_Blackliste, PRIIP_auf_Blackliste, UDAL_nicht_verfuegbar, n/a
Abruf_Infoblaetter: WA_von_FWW, PIB_von_DOTi, PIB_von_C&M-FIC, PIB_von_PC_PM, KID_von_PC_PM, KID_von_DOTi, KID_von_externem_Hersteller

IF [Eingangskanal] = "HOST_T19901"
THEN [Orderart] <> "Kauf_(Beratungsdatum_gueltig)"
AND [Produktzyklus] <> "Neuemission_offen"
AND [Produktzyklus] <> "n/a"
AND [Dienstleistungsart] <> "n/a"
AND [Orderart] <> "n/a"
AND [Initiator] = "n/a"
AND [Auftragserteilung] = "n/a"
AND [Bereitstellungsdokumente]= "n/a"
AND [UDAL-Status] = "n/a";

IF [Eingangskanal] in {"HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900"}
THEN [Produktzyklus] <> "Neuemission_Information"
AND [Produktzyklus] <> "Neuemission_offen"
AND [Produktzyklus] <> "n/a"
AND [Dienstleistungsart] <> "n/a"
AND [Orderart] <> "n/a"
AND [Initiator] = "n/a"
AND [Auftragserteilung] = "n/a"
AND [Bereitstellungsdokumente]= "n/a"
AND [UDAL-Status] = "n/a";

IF [Eingangskanal] like "EVA_*"
THEN [Initiator] <> "n/a"
AND [Produktzyklus] <> "n/a"
AND [Dienstleistungsart] <> "n/a"
AND [Orderart] <> "n/a"
AND [Auftragserteilung] <> "n/a"
AND [Bereitstellungsdokumente] <> "n/a"
AND [UDAL-Status] <> "n/a";

IF [Eingangskanal] IN {"Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC"}
THEN [Produktzyklus] <> "Neuemission_Information"
AND [Produktzyklus] <> "Neuemission_offen"
AND [Produktzyklus] <> "n/a"
AND [Dienstleistungsart] <> "n/a"
AND [Orderart] <> "n/a";

IF [Eingangskanal] like "Onlinebanking*"
THEN [Dienstleistungsart]="beratungsfreies_Geschaeft"
AND [Produktzyklus] <> "n/a"
AND [Dienstleistungsart] <> "n/a"
AND [Orderart] <> "Storno"
AND [Orderart] <> "Berichtigungsauftrag"
AND [Orderart] <> "Kauf_(Beratungsdatum_gueltig)"
AND [Orderart] <> "n/a"
AND [Initiator] = "n/a"
AND [Auftragserteilung] = "n/a"
AND [Bereitstellungsdokumente] = "n/a"
AND [UDAL-Status] <>"Back_up-Betrieb";

IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order"}
THEN [Produktzyklus] <>"Neuemission_Information"
AND [Produktzyklus] <>"Neuemission_offen"
AND [Produktzyklus] <>"n/a"
AND [Dienstleistungsart] <>"n/a"
AND [Orderart] <>"n/a";

IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg"}
THEN [Orderart] <>"Storno"
AND [Orderart] <>"Berichtigungsauftrag"
AND [Orderart] <>"Kauf_(Beratungsdatum_gueltig)"
AND [Produktzyklus] <>"n/a"
AND [Dienstleistungsart] <>"n/a"
AND [Orderart] <>"n/a";

IF [Eingangskanal] in {"EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order"}
THEN [Orderart] <>"Storno"
AND [Orderart] <>"Berichtigungsauftrag"
AND [Produktzyklus] <>"n/a"
AND [Dienstleistungsart] <>"n/a"
AND [Orderart] <>"n/a";

IF [Eingangskanal] IN {"Infobroker", "commerzbank_de_pib"}
THEN [Finanzinstrument] <> "EMISID"
AND [Produktzyklus] = "n/a"
AND [Dienstleistungsart] = "n/a"
AND [Orderart] = "n/a"
AND [Initiator] = "n/a"
AND [Auftragserteilung] = "n/a"
AND [Bereitstellungsdokumente]= "n/a"
AND [UDAL-Status] <> "Back_up-Betrieb";

試してみると、実際、2時間半以上かかっても終わらず現在も計算中だ。PICTの作者であるJacekによると、計算時間がexponentialになっちゃうのでしょうがないんだよということだ。それも無理からぬことで、これは要するにSAT問題(NP完全)を解きながらできるだけ小さなテストスイートの生成を行わなければいけないのだから、どうしたもんかなー、と考えこんでしまうところだ。

なのだけれど、現実世界の制約条件ってこのくらいにはなるよね、と思うし、因子数は10、各水準数もそれほど多くなく、総当りでテストケースを作るとしても134,719,200通りしかありえない。さらによく見てみると、因子Abruf_Infoblaetterは制約に全然関与しない。

このくらいだったらJCUnitではなんとかなるのではないか、と思い試してみた。JCUnitで同じモデルを実装すると以下のようになる。

@RunWith(JCUnit8.class)
public class Issue13 {
  /**
   * Eingangskanal:
   * <p>
   * EVA_Anlageberatung, EVA_Order, EVA_Sonderweg, EVA_Sparplan, EVA_Neuemission,
   * EVA_Direkteinstieg, HOST_T19000, HOST_T19001, HOST_T19901, HOST_T19750,
   * HOST_T28900, Onlinebanking_PC, Onlinebanking_MSB, Onlinebanking_Neuemission_PC,
   * Onlinebanking_Neuemission_MSB, Onlinebanking_Tablet_PC, Infobroker, commerzbank_de_pib
   */
  @ParameterSource
  public Parameter.Factory<String> eingangskanal() {
    return Parameters.simple(
        "EVA_Anlageberatung", "EVA_Order", "EVA_Sonderweg", "EVA_Sparplan", "EVA_Neuemission",
        "EVA_Direkteinstieg", "HOST_T19000", "HOST_T19001", "HOST_T19901", "HOST_T19750",
        "HOST_T28900", "Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Neuemission_PC",
        "Onlinebanking_Neuemission_MSB", "Onlinebanking_Tablet_PC", "Infobroker", "commerzbank_de_pib"
    );
  }

  /**
   * Finanzinstrument:
   * <p>
   * Aktie, Unstrukturierte_Anleihe, strukturierte_Anleihe, Inv.Fonds, OIF,
   * Zertifikat, Optionsschein, Xetra_Gold_ETC, EMISID
   */
  @ParameterSource
  public Parameter.Factory<String> finanzinstrument() {
    return Parameters.simple(
        "Aktie", "Unstrukturierte_Anleihe", "strukturierte_Anleihe", "Inv.Fonds", "OIF",
        "Zertifikat", "Optionsschein", "Xetra_Gold_ETC", "EMISID"
    );
  }

  /**
   * Produktzyklus:
   * <p>
   * Neuemission_Information, Neuemission_offen, Neuemission_geschlossen, Neuemission_abgerechnet,
   * Sekundaermarkt, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> produktzyklus() {
    return Parameters.simple(
        "Neuemission_Information", "Neuemission_offen", "Neuemission_geschlossen", "Neuemission_abgerechnet",
        "Sekundaermarkt", "n/a"
    );
  }

  /**
   * Dienstleistungsart: Anlageberatung, beratungsfreies_Geschaeft, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> dienstleistungsart() {
    return Parameters.simple(
        "Anlageberatung", "beratungsfreies_Geschaeft", "n/a"
    );
  }

  /**
   * Orderart:
   * Kauf(Beratungsdatum_gueltig), Kauf_(ohne_Beratungsdatum), Verkauf,
   * aenderung, Streichung, Storno, Berichtigungsauftrag, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> orderart() {
    return Parameters.simple(
        "Kauf(Beratungsdatum_gueltig)", "Kauf_(ohne_Beratungsdatum)", "Verkauf",
        "aenderung", "Streichung", "Storno", "Berichtigungsauftrag", "n/a"
    );
  }

  /**
   * Initiator: Kunde, Bank, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> initiator() {
    return Parameters.simple(
        "Kunde", "Bank", "n/a"
    );
  }

  /**
   * Auftragserteilung: telefonisch, persoenlich, schriftlich, Haustuergeschaeft, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> auftragserteilung() {
    return Parameters.simple(
        "telefonisch", "persoenlich", "schriftlich", "Haustuergeschaeft", "n/a"
    );
  }

  /**
   * Bereitstellungsdokumente:
   * <p>
   * Beratungsprotokoll_Kunde, Beratungsprotokoll_Interessent, Beratungsprotokoll_Potenzial,
   * Nachtraeglicher_KID-Versand, n/a
   */
  @ParameterSource
  public Parameter.Factory<String> bereitstellungsdokumente() {
    return Parameters.simple(
        "Beratungsprotokoll_Kunde", "Beratungsprotokoll_Interessent", "Beratungsprotokoll_Potenzial",
        "Nachtraeglicher_KID-Versand", "n/a"
    );
  }

  /**
   * UDAL-Status:
   * <p>
   * Normalbetrieb, Back_up-Betrieb, PRIIP,ohne_KID, WKN_nicht_vorhanden, WKN_inaktiv/geloescht,
   * defektes_Dokument, Virus, non-PRIIP_auf_Blackliste, PRIIP_auf_Blackliste, UDAL_nicht_verfuegbar,
   * n/a
   */
  @ParameterSource
  public Parameter.Factory<String> udalStatus() {
    return Parameters.simple(
        "Normalbetrieb", "Back_up-Betrieb", "PRIIP", "ohne_KID", "WKN_nicht_vorhanden",
        "WKN_inaktiv/geloescht", "defektes_Dokument", "Virus", "non-PRIIP_auf_Blackliste",
        "PRIIP_auf_Blackliste", "UDAL_nicht_verfuegbar", "n/a"
    );
  }

  /**
   * Abruf_Infoblaetter:
   * <p>
   * WA_von_FWW, PIB_von_DOTi, PIB_von_C&M-FIC, PIB_von_PC_PM,
   * KID_von_PC_PM, KID_von_DOTi, KID_von_externem_Hersteller
   */
  @ParameterSource
  public Parameter.Factory<String> abruf_Infoblaetter() {
    return Parameters.simple(
        "WA_von_FWW", "PIB_von_DOTi", "PIB_von_C&M-FIC", "PIB_von_PC_PM",
        "KID_von_PC_PM", "KID_von_DOTi", "KID_von_externem_Hersteller"
    );
  }

  ////
  //1
  //
  //IF [Eingangskanal] = "HOST_T19901"
  //THEN [Orderart] <> "Kauf_(Beratungsdatum_gueltig)"
  //AND [Produktzyklus] <> "Neuemission_offen"
  //AND [Produktzyklus] <> "n/a"
  //AND [Dienstleistungsart] <> "n/a"
  //AND [Orderart] <> "n/a"
  //AND [Initiator] = "n/a"
  //AND [Auftragserteilung] = "n/a"
  //AND [Bereitstellungsdokumente]= "n/a"
  //AND [UDAL-Status] = "n/a";
  @Condition(constraint = true)
  public boolean constraint1(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus
  ) {
    //noinspection SimplifiableIfStatement
    if (Objects.equals(eingangskanal, "HOST_T19901"))
      return (
          !Objects.equals(orderart, "Kauf_(Beratungsdatum_gueltig)") &&
              !Objects.equals(produktzyklus, "Neuemission_offen") &&
              !Objects.equals(produktzyklus, "n/a") &&
              !Objects.equals(dienstleistungsart, "n/a") &&
              !Objects.equals(orderart, "n/a") &&
              Objects.equals(initiator, "n/a") &&
              Objects.equals(auftragserteilung, "n/a") &&
              Objects.equals(bereitstellungsdokumente, "n/a") &&
              Objects.equals(udalStatus, "n/a")
      );
    return true;
  }

  ////2
  //
  //IF [Eingangskanal] in {"HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900"}
  //THEN [Produktzyklus] <> "Neuemission_Information"
  //AND [Produktzyklus] <> "Neuemission_offen"
  //AND [Produktzyklus] <> "n/a"
  //AND [Dienstleistungsart] <> "n/a"
  //AND [Orderart] <> "n/a"
  //AND [Initiator] = "n/a"
  //AND [Auftragserteilung] = "n/a"
  //AND [Bereitstellungsdokumente]= "n/a"
  //AND [UDAL-Status] = "n/a";
  @Condition(constraint = true)
  public boolean constraint2(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus
  ) {
    if (asList("HOST_T19000", "HOST_T19001", "HOST_T19750", "HOST_T28900").contains(eingangskanal)) {
      return !produktzyklus.equals("Neuemission_Information") &&
          !produktzyklus.equals("Neuemission_offen") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("n/a") &&
          initiator.equals("n/a") &&
          auftragserteilung.equals("n/a") &&
          bereitstellungsdokumente.equals("n/a") &&
          udalStatus.equals("n/a");
    }
    return true;
  }

  ////3
  //
  //IF [Eingangskanal] like "EVA_*"
  //THEN [Initiator] <> "n/a"
  //AND [Produktzyklus] <> "n/a"
  //AND [Dienstleistungsart] <> "n/a"
  //AND [Orderart] <> "n/a"
  //AND [Auftragserteilung] <> "n/a"
  //AND [Bereitstellungsdokumente] <> "n/a"
  //AND [UDAL-Status] <> "n/a";
  @Condition(constraint = true)
  public boolean constraint3(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus
  ) {
    if (eingangskanal.startsWith("EVA_"))
      return !initiator.equals("n/a") &&
          !produktzyklus.equals("n/a") &&
          !orderart.equals("n/a") &&
          !auftragserteilung.equals("n/a") &&
          !bereitstellungsdokumente.equals("n/a") &&
          !udalStatus.equals("n/a");
    return true;
  }

  ////4
  //
  //IF [Eingangskanal] IN {"Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC"}
  //THEN [Produktzyklus] <> "Neuemission_Information"
  //AND [Produktzyklus] <> "Neuemission_offen"
  //AND [Produktzyklus] <> "n/a"
  //AND [Dienstleistungsart] <> "n/a"
  //AND [Orderart] <> "n/a";
  @Condition(constraint = true)
  public boolean constraint4(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart
  ) {
    if (asList("Onlinebanking_PC", "Onlinebanking_MSB", "Onlinebanking_Tablet_PC").contains(eingangskanal))
      return !produktzyklus.equals("Neuemission_Information") &&
          !produktzyklus.equals("Neuemission_offen") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("n/a");
    return true;
  }

  ////5
  //
  //IF [Eingangskanal] like "Onlinebanking*"
  //THEN [Dienstleistungsart]="beratungsfreies_Geschaeft"
  //AND [Produktzyklus] <> "n/a"
  //AND [Dienstleistungsart] <> "n/a"
  //AND [Orderart] <> "Storno"
  //AND [Orderart] <> "Berichtigungsauftrag"
  //AND [Orderart] <> "Kauf_(Beratungsdatum_gueltig)"
  //AND [Orderart] <> "n/a"
  //AND [Initiator] = "n/a"
  //AND [Auftragserteilung] = "n/a"
  //AND [Bereitstellungsdokumente] = "n/a"
  //AND [UDAL-Status] <>"Back_up-Betrieb";
  @Condition(constraint = true)
  public boolean constraint5(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus
  ) {
    if (eingangskanal.startsWith("Onlinebanking"))
      return dienstleistungsart.equals("beratungsfreies_Geschaeft") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("Storno") &&
          !orderart.equals("Berichtigungsauftrag") &&
          !orderart.equals("Kauf_(Beratungsdatum_gueltig)") &&
          !orderart.equals("n/a") &&
          initiator.equals("n/a") &&
          auftragserteilung.equals("n/a") &&
          bereitstellungsdokumente.equals("n/a") &&
          !udalStatus.equals("Back_up-Betrieb");
    return true;
  }

  ////6
  //IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order"}
  //THEN [Produktzyklus] <>"Neuemission_Information"
  //AND [Produktzyklus] <>"Neuemission_offen"
  //AND [Produktzyklus] <>"n/a"
  //AND [Dienstleistungsart] <>"n/a"
  //AND [Orderart] <>"n/a";
  @Condition(constraint = true)
  public boolean constraint6(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart
  ) {
    if (asList("EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg", "EVA Order").contains(eingangskanal))
      return !produktzyklus.equals("Neuemission_Information") &&
          !produktzyklus.equals("Neuemission_offen") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("n/a");
    return true;
  }

  //7
  //IF [Eingangskanal] IN {"EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg"}
  //THEN [Orderart] <>"Storno"
  //AND [Orderart] <>"Berichtigungsauftrag"
  //AND [Orderart] <>"Kauf_(Beratungsdatum_gueltig)"
  //AND [Produktzyklus] <>"n/a"
  //AND [Dienstleistungsart] <>"n/a"
  //AND [Orderart] <>"n/a";
  @Condition(constraint = true)
  public boolean constraint7(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart
  ) {
    if (asList("EVA_Sonderweg", "EVA_Sparplan", "EVA_Direkteinstieg").contains(eingangskanal))
      return !orderart.equals("Storno") &&
          !orderart.equals("Berichtigungsauftrag") &&
          !orderart.equals("Kauf_(Beratungsdatum_gueltig)") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("n/a");
    return true;
  }

  //8
  //IF [Eingangskanal] in {"EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order"}
  //THEN [Orderart] <>"Storno"
  //AND [Orderart] <>"Berichtigungsauftrag"
  //AND [Produktzyklus] <>"n/a"
  //AND [Dienstleistungsart] <>"n/a"
  //AND [Orderart] <>"n/a";
  @Condition(constraint = true)
  public boolean constraint8(
      @From("eingangskanal") String eingangskanal,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart
  ) {
    if (asList("EVA_Anlageberatung", "EVA_Neuemission", "EVA_Order").contains(eingangskanal))
      return !orderart.equals("Storno") &&
          !orderart.equals("Berichtigungsauftrag") &&
          !produktzyklus.equals("n/a") &&
          !dienstleistungsart.equals("n/a") &&
          !orderart.equals("n/a");
    return true;
  }

  //9
  //
  //IF [Eingangskanal] IN {"Infobroker", "commerzbank_de_pib"}
  //THEN [Finanzinstrument] <> "EMISID"
  //AND [Produktzyklus] = "n/a"
  //AND [Dienstleistungsart] = "n/a"
  //AND [Orderart] = "n/a"
  //AND [Initiator] = "n/a"
  //AND [Auftragserteilung] = "n/a"
  //AND [Bereitstellungsdokumente]= "n/a"
  //AND [UDAL-Status] <> "Back_up-Betrieb";
  @Condition(constraint = true)
  public boolean constraint9(
      @From("eingangskanal") String eingangskanal,
      @From("finanzinstrument") String finanzinstrument,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus
  ) {
    if (asList("Infobroker", "commerzbank_de_pib").contains(eingangskanal))
      return !finanzinstrument.equals("EMISID") &&
          produktzyklus.equals("n/a") &&
          dienstleistungsart.equals("n/a") &&
          orderart.equals("n/a") &&
          initiator.equals("n/a") &&
          auftragserteilung.equals("n/a") &&
          bereitstellungsdokumente.equals("n/a") &&
          !udalStatus.equals("Back_up-Betrieb");
    return true;
  }

  @Test
  public void test(
      @From("eingangskanal") String eingangskanal,
      @From("finanzinstrument") String finanzinstrument,
      @From("orderart") String orderart,
      @From("produktzyklus") String produktzyklus,
      @From("dienstleistungsart") String dienstleistungsart,
      @From("initiator") String initiator,
      @From("auftragserteilung") String auftragserteilung,
      @From("bereitstellungsdokumente") String bereitstellungsdokumente,
      @From("udalStatus") String udalStatus,
      @From("abruf_Infoblaetter") String abruf_Infoblaetter
  ) {
    System.out.printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s%n",
        eingangskanal,
        finanzinstrument,
        orderart,
        produktzyklus,
        dienstleistungsart,
        initiator,
        auftragserteilung,
        bereitstellungsdokumente,
        udalStatus,
        abruf_Infoblaetter
    );
  }
}

結局生成には2時間弱かかったが、テストスイートは以下のとおりになる。

// eingangskanal, finanzinstrument, orderart, produktzyklus, dienstleistungsart, initiator, auftragserteilung, bereitstellungsdokumente, udalStatus, abruf_Infoblaetter
EVA_Anlageberatung,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Normalbetrieb,WA_von_FWW
EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_DOTi
EVA_Anlageberatung,strukturierte_Anleihe,Verkauf,Neuemission_geschlossen,Anlageberatung,Bank,schriftlich,Beratungsprotokoll_Potenzial,PRIIP,PIB_von_C&M-FIC
EVA_Anlageberatung,Inv.Fonds,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,Haustuergeschaeft,Nachtraeglicher_KID-Versand,ohne_KID,PIB_von_PC_PM
EVA_Anlageberatung,OIF,Streichung,Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Interessent,WKN_nicht_vorhanden,KID_von_PC_PM
EVA_Anlageberatung,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,Kunde,schriftlich,Nachtraeglicher_KID-Versand,WKN_inaktiv/geloescht,KID_von_DOTi
EVA_Anlageberatung,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,Kunde,persoenlich,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_externem_Hersteller
EVA_Anlageberatung,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Potenzial,Virus,PIB_von_PC_PM
EVA_Anlageberatung,EMISID,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,PIB_von_C&M-FIC
EVA_Anlageberatung,Aktie,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,PRIIP_auf_Blackliste,KID_von_DOTi
EVA_Anlageberatung,Aktie,Verkauf,Neuemission_offen,beratungsfreies_Geschaeft,Bank,telefonisch,Nachtraeglicher_KID-Versand,UDAL_nicht_verfuegbar,KID_von_PC_PM
EVA_Order,Unstrukturierte_Anleihe,Verkauf,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,Normalbetrieb,PIB_von_DOTi
EVA_Order,Aktie,aenderung,Sekundaermarkt,beratungsfreies_Geschaeft,Kunde,schriftlich,Beratungsprotokoll_Potenzial,Back_up-Betrieb,WA_von_FWW
EVA_Order,Inv.Fonds,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Interessent,PRIIP,KID_von_externem_Hersteller
EVA_Order,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_Information,beratungsfreies_Geschaeft,Kunde,telefonisch,Nachtraeglicher_KID-Versand,ohne_KID,PIB_von_C&M-FIC
EVA_Order,Zertifikat,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Potenzial,WKN_nicht_vorhanden,WA_von_FWW
EVA_Order,OIF,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Bank,schriftlich,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_PC_PM
EVA_Order,Xetra_Gold_ETC,Streichung,Neuemission_offen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_DOTi
EVA_Order,Optionsschein,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,Virus,KID_von_PC_PM
EVA_Order,Aktie,Streichung,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,non-PRIIP_auf_Blackliste,KID_von_externem_Hersteller
EVA_Order,EMISID,Verkauf,Neuemission_Information,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,PRIIP_auf_Blackliste,PIB_von_PC_PM
EVA_Order,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Interessent,UDAL_nicht_verfuegbar,PIB_von_DOTi
EVA_Sonderweg,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Interessent,Normalbetrieb,PIB_von_DOTi
EVA_Sonderweg,Inv.Fonds,Verkauf,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM
EVA_Sonderweg,Aktie,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,PRIIP,WA_von_FWW
EVA_Sonderweg,Unstrukturierte_Anleihe,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,schriftlich,Beratungsprotokoll_Potenzial,ohne_KID,KID_von_PC_PM
EVA_Sonderweg,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,schriftlich,Beratungsprotokoll_Interessent,WKN_nicht_vorhanden,PIB_von_C&M-FIC
EVA_Sonderweg,Xetra_Gold_ETC,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,WKN_inaktiv/geloescht,WA_von_FWW
EVA_Sonderweg,OIF,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,Kunde,telefonisch,Nachtraeglicher_KID-Versand,defektes_Dokument,KID_von_DOTi
EVA_Sonderweg,Zertifikat,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Virus,KID_von_externem_Hersteller
EVA_Sonderweg,Unstrukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Nachtraeglicher_KID-Versand,non-PRIIP_auf_Blackliste,PIB_von_PC_PM
EVA_Sonderweg,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,KID_von_externem_Hersteller
EVA_Sonderweg,EMISID,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,KID_von_externem_Hersteller
EVA_Sparplan,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,Normalbetrieb,KID_von_DOTi
EVA_Sparplan,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM
EVA_Sparplan,Unstrukturierte_Anleihe,aenderung,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,PRIIP,PIB_von_DOTi
EVA_Sparplan,Aktie,Verkauf,Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,ohne_KID,PIB_von_PC_PM
EVA_Sparplan,Xetra_Gold_ETC,aenderung,Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Nachtraeglicher_KID-Versand,WKN_nicht_vorhanden,KID_von_externem_Hersteller
EVA_Sparplan,Optionsschein,Streichung,Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Potenzial,WKN_inaktiv/geloescht,PIB_von_DOTi
EVA_Sparplan,Zertifikat,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,defektes_Dokument,PIB_von_C&M-FIC
EVA_Sparplan,OIF,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,Virus,WA_von_FWW
EVA_Sparplan,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,non-PRIIP_auf_Blackliste,KID_von_DOTi
EVA_Sparplan,strukturierte_Anleihe,Streichung,Neuemission_abgerechnet,Anlageberatung,Kunde,schriftlich,Nachtraeglicher_KID-Versand,PRIIP_auf_Blackliste,WA_von_FWW
EVA_Sparplan,strukturierte_Anleihe,aenderung,Neuemission_abgerechnet,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Potenzial,UDAL_nicht_verfuegbar,KID_von_DOTi
EVA_Neuemission,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_offen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Potenzial,Normalbetrieb,PIB_von_C&M-FIC
EVA_Neuemission,Zertifikat,Streichung,Neuemission_Information,beratungsfreies_Geschaeft,Bank,Haustuergeschaeft,Nachtraeglicher_KID-Versand,Back_up-Betrieb,PIB_von_PC_PM
EVA_Neuemission,Optionsschein,Verkauf,Neuemission_offen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP,WA_von_FWW
EVA_Neuemission,Xetra_Gold_ETC,Kauf_(ohne_Beratungsdatum),Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,ohne_KID,PIB_von_DOTi
EVA_Neuemission,Aktie,Verkauf,Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_nicht_vorhanden,KID_von_DOTi
EVA_Neuemission,Unstrukturierte_Anleihe,aenderung,Neuemission_Information,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Interessent,WKN_inaktiv/geloescht,KID_von_PC_PM
EVA_Neuemission,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,defektes_Dokument,KID_von_externem_Hersteller
EVA_Neuemission,Inv.Fonds,Streichung,Neuemission_offen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,Virus,PIB_von_C&M-FIC
EVA_Neuemission,Inv.Fonds,Verkauf,Neuemission_Information,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,WA_von_FWW
EVA_Neuemission,Inv.Fonds,aenderung,Neuemission_offen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,PIB_von_DOTi
EVA_Neuemission,Inv.Fonds,Streichung,Neuemission_geschlossen,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,WA_von_FWW
EVA_Direkteinstieg,Zertifikat,Streichung,Sekundaermarkt,Anlageberatung,Kunde,Haustuergeschaeft,Nachtraeglicher_KID-Versand,Normalbetrieb,PIB_von_DOTi
EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,Bank,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_externem_Hersteller
EVA_Direkteinstieg,Xetra_Gold_ETC,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,Anlageberatung,Kunde,persoenlich,Beratungsprotokoll_Interessent,PRIIP,KID_von_PC_PM
EVA_Direkteinstieg,Optionsschein,aenderung,Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Potenzial,ohne_KID,KID_von_DOTi
EVA_Direkteinstieg,Unstrukturierte_Anleihe,Verkauf,Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_nicht_vorhanden,WA_von_FWW
EVA_Direkteinstieg,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_C&M-FIC
EVA_Direkteinstieg,Inv.Fonds,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,defektes_Dokument,PIB_von_PC_PM
EVA_Direkteinstieg,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Kunde,Virus,PIB_von_DOTi
EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,non-PRIIP_auf_Blackliste,PIB_von_DOTi
EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,PRIIP_auf_Blackliste,PIB_von_C&M-FIC
EVA_Direkteinstieg,OIF,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,UDAL_nicht_verfuegbar,PIB_von_C&M-FIC
HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
Onlinebanking_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller
Onlinebanking_PC,OIF,Streichung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,KID_von_DOTi
Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,WA_von_FWW
Onlinebanking_PC,strukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_DOTi
Onlinebanking_PC,Inv.Fonds,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_C&M-FIC
Onlinebanking_PC,Aktie,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,KID_von_PC_PM
Onlinebanking_PC,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_DOTi
Onlinebanking_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_C&M-FIC
Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_PC_PM
Onlinebanking_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_PC_PM
Onlinebanking_PC,EMISID,aenderung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi
Onlinebanking_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM
Onlinebanking_MSB,Zertifikat,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,WA_von_FWW
Onlinebanking_MSB,OIF,Verkauf,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_externem_Hersteller
Onlinebanking_MSB,Inv.Fonds,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_DOTi
Onlinebanking_MSB,strukturierte_Anleihe,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_C&M-FIC
Onlinebanking_MSB,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,WA_von_FWW
Onlinebanking_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_PC_PM
Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_PC_PM
Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_DOTi
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM
Infobroker,Unstrukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP,PIB_von_PC_PM
Infobroker,OIF,n/a,n/a,n/a,n/a,n/a,n/a,WKN_inaktiv/geloescht,KID_von_externem_Hersteller
Infobroker,Zertifikat,n/a,n/a,n/a,n/a,n/a,n/a,defektes_Dokument,PIB_von_DOTi
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi
HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
Onlinebanking_Neuemission_PC,strukturierte_Anleihe,Verkauf,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_PC_PM
HOST_T19000,EMISID,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19000,EMISID,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19001,EMISID,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
EVA_Order,Xetra_Gold_ETC,Streichung,Neuemission_offen,Anlageberatung,Bank,Haustuergeschaeft,Beratungsprotokoll_Kunde,defektes_Dokument,KID_von_externem_Hersteller
HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19000,Aktie,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19001,Unstrukturierte_Anleihe,Berichtigungsauftrag,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
Onlinebanking_Neuemission_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_PC_PM
EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_C&M-FIC
EVA_Anlageberatung,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,Bank,persoenlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,KID_von_DOTi
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19901,strukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19750,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T28900,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW
Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi
Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC
Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi
Onlinebanking_Neuemission_PC,EMISID,Streichung,Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi
Onlinebanking_Neuemission_MSB,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,WA_von_FWW
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_DOTi
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_C&M-FIC
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_PC_PM
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_DOTi
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,Normalbetrieb,KID_von_externem_Hersteller
Onlinebanking_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,WA_von_FWW
Onlinebanking_MSB,Zertifikat,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_DOTi
Onlinebanking_Neuemission_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,PIB_von_PC_PM
Onlinebanking_Neuemission_PC,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_PC_PM
Onlinebanking_Neuemission_PC,Inv.Fonds,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,KID_von_externem_Hersteller
Onlinebanking_Neuemission_PC,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,WA_von_FWW
Onlinebanking_Neuemission_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,PIB_von_DOTi
Onlinebanking_Neuemission_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,PIB_von_PC_PM
Onlinebanking_Neuemission_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_PC_PM
Onlinebanking_Neuemission_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_DOTi
Onlinebanking_Neuemission_MSB,EMISID,Kauf_(ohne_Beratungsdatum),Neuemission_offen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,WA_von_FWW
Onlinebanking_Neuemission_MSB,Unstrukturierte_Anleihe,Verkauf,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,PIB_von_DOTi
Onlinebanking_Neuemission_MSB,strukturierte_Anleihe,aenderung,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_C&M-FIC
Onlinebanking_Neuemission_MSB,Inv.Fonds,Streichung,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_PC_PM
Onlinebanking_Neuemission_MSB,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,KID_von_PC_PM
Onlinebanking_Neuemission_MSB,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,KID_von_DOTi
Onlinebanking_Neuemission_MSB,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_externem_Hersteller
Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,WA_von_FWW
Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_DOTi
Onlinebanking_Neuemission_MSB,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
Onlinebanking_Tablet_PC,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP,KID_von_PC_PM
Onlinebanking_Tablet_PC,EMISID,Verkauf,Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,ohne_KID,KID_von_DOTi
Onlinebanking_Tablet_PC,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_nicht_vorhanden,KID_von_externem_Hersteller
Onlinebanking_Tablet_PC,Inv.Fonds,Streichung,Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,WKN_inaktiv/geloescht,WA_von_FWW
Onlinebanking_Tablet_PC,OIF,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,PIB_von_DOTi
Onlinebanking_Tablet_PC,Zertifikat,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,Virus,PIB_von_C&M-FIC
Onlinebanking_Tablet_PC,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,PIB_von_PC_PM
Onlinebanking_Tablet_PC,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_PC_PM
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_DOTi
Onlinebanking_Tablet_PC,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
Infobroker,strukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,ohne_KID,PIB_von_C&M-FIC
Infobroker,Inv.Fonds,n/a,n/a,n/a,n/a,n/a,n/a,WKN_nicht_vorhanden,PIB_von_PC_PM
Infobroker,Optionsschein,n/a,n/a,n/a,n/a,n/a,n/a,Virus,KID_von_externem_Hersteller
Infobroker,Xetra_Gold_ETC,n/a,n/a,n/a,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,WA_von_FWW
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP_auf_Blackliste,PIB_von_DOTi
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,UDAL_nicht_verfuegbar,PIB_von_C&M-FIC
Infobroker,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,n/a,PIB_von_PC_PM
commerzbank_de_pib,Unstrukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP,KID_von_DOTi
commerzbank_de_pib,strukturierte_Anleihe,n/a,n/a,n/a,n/a,n/a,n/a,ohne_KID,KID_von_externem_Hersteller
commerzbank_de_pib,Inv.Fonds,n/a,n/a,n/a,n/a,n/a,n/a,WKN_nicht_vorhanden,WA_von_FWW
commerzbank_de_pib,OIF,n/a,n/a,n/a,n/a,n/a,n/a,WKN_inaktiv/geloescht,PIB_von_DOTi
commerzbank_de_pib,Zertifikat,n/a,n/a,n/a,n/a,n/a,n/a,defektes_Dokument,PIB_von_C&M-FIC
commerzbank_de_pib,Optionsschein,n/a,n/a,n/a,n/a,n/a,n/a,Virus,PIB_von_PC_PM
commerzbank_de_pib,Xetra_Gold_ETC,n/a,n/a,n/a,n/a,n/a,n/a,non-PRIIP_auf_Blackliste,KID_von_PC_PM
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,PRIIP_auf_Blackliste,KID_von_DOTi
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,UDAL_nicht_verfuegbar,KID_von_externem_Hersteller
commerzbank_de_pib,Aktie,n/a,n/a,n/a,n/a,n/a,n/a,n/a,WA_von_FWW
EVA_Sparplan,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,schriftlich,Beratungsprotokoll_Interessent,Back_up-Betrieb,PIB_von_DOTi
EVA_Neuemission,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,Anlageberatung,Kunde,telefonisch,Nachtraeglicher_KID-Versand,WKN_nicht_vorhanden,PIB_von_C&M-FIC
EVA_Direkteinstieg,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,WKN_inaktiv/geloescht,PIB_von_PC_PM
HOST_T19000,Unstrukturierte_Anleihe,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19000,strukturierte_Anleihe,Berichtigungsauftrag,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19000,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19000,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19000,Zertifikat,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19000,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19000,Xetra_Gold_ETC,Storno,Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19001,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19001,strukturierte_Anleihe,Storno,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19001,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19001,OIF,Verkauf,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19001,Zertifikat,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19001,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19001,Xetra_Gold_ETC,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19901,Aktie,Berichtigungsauftrag,Neuemission_Information,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19901,Unstrukturierte_Anleihe,Storno,Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19901,Inv.Fonds,Kauf_(ohne_Beratungsdatum),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19901,OIF,Verkauf,Neuemission_abgerechnet,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19901,Zertifikat,aenderung,Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19901,Optionsschein,Streichung,Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19901,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19901,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19750,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19750,Unstrukturierte_Anleihe,Verkauf,Neuemission_abgerechnet,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19750,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T19750,OIF,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T19750,Zertifikat,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T19750,Optionsschein,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T19750,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19750,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T28900,Aktie,Kauf(Beratungsdatum_gueltig),Neuemission_abgerechnet,beratungsfreies_Geschaeft,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T28900,Unstrukturierte_Anleihe,Kauf_(ohne_Beratungsdatum),Sekundaermarkt,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
HOST_T28900,strukturierte_Anleihe,aenderung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_PC_PM
HOST_T28900,Inv.Fonds,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_PC_PM
HOST_T28900,Zertifikat,Streichung,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_DOTi
HOST_T28900,Optionsschein,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T28900,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T28900,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
Onlinebanking_MSB,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_geschlossen,beratungsfreies_Geschaeft,n/a,n/a,n/a,defektes_Dokument,PIB_von_C&M-FIC
EVA_Anlageberatung,Optionsschein,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,Haustuergeschaeft,Beratungsprotokoll_Kunde,Back_up-Betrieb,PIB_von_PC_PM
EVA_Anlageberatung,Xetra_Gold_ETC,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Back_up-Betrieb,KID_von_PC_PM
EVA_Anlageberatung,EMISID,Kauf(Beratungsdatum_gueltig),Neuemission_Information,Anlageberatung,Kunde,telefonisch,Beratungsprotokoll_Kunde,Virus,KID_von_DOTi
HOST_T19000,Inv.Fonds,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,KID_von_externem_Hersteller
HOST_T19000,OIF,Berichtigungsauftrag,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,WA_von_FWW
HOST_T19000,Zertifikat,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_DOTi
HOST_T19000,Optionsschein,Storno,Neuemission_geschlossen,Anlageberatung,n/a,n/a,n/a,n/a,PIB_von_C&M-FIC
Onlinebanking_Neuemission_PC,Aktie,Kauf(Beratungsdatum_gueltig),Sekundaermarkt,beratungsfreies_Geschaeft,n/a,n/a,n/a,Normalbetrieb,PIB_von_PC_PM

制約のないモデルだとPICTは目を瞠るような速さでテストの生成を行う。因子数100、各因子の水準数2の場合、文字通り一瞬で生成が終わる(テストケース数16)。JCUnitは30秒ほどかかりテストケース数は18となるので、さすが老舗は違うなと舌を巻いたのだが、制約の取り扱いについてはJCUnitの方が少しだけ優れていると言えるようになったようだ。

0.6.4リリース

前回のポストで報告したように、JUCnit 0.6.3やそれを使ったアプリケーションはJDK 1.7.0_79ではコンパイルできない。 2016-04-05 - jcunit's blog

これはJDK 1.7.0_80で修正されたjavacの以下のバグが原因だ。

http://bugs.java.com/view_bug.do?bug_id=8013485

このバグを踏んだ場合、以下のコンパイルエラーが生じる。

annotation com.github.dakusui.jcunit.runners.standard.annotations.Checker is missing value for the attribute <clinit>

この問題を回避するため、以下の修正を含むJCUnit 0.6.4をリリースした。

github.com

上のエラーに遭遇したら、こちらを使ってみて欲しい。 以下がmaven coordinate

    <dependency>
      <groupId>com.github.dakusui</groupId>
      <artifactId>jcunit</artifactId>
      <version>[0.6.4,)</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

JDK 1.6.0_45, JDK 1.8.0_25等でで発生しないことは確認してあるが、このバグがどの時点で混入したかは今のところ不明である。 不本意な内容の修正であるが、現在のメインストリームと考えられるJDK 1.7.0でやっと1年前に修正されたバグであり、現実の問題としてJDKのアップデート(すら)が困難な環境にある人々はそれなりに多くいると考えられるので、実施することにした。

JDK 1.7.0_79以前でコンパイルできない。

JDK 1.7.0_80より古いjavacを使っている場合、JCUnit及びそれを使用したライブラリのコンパイルができないことが判明した。ちなみにこれはjavacのバグだ。 これは、確認している限り、JDK 1.6.0_45では起きないし、手元のJDK 8系統でも起きたことがない。 詳報は後日このブログでお知らせするが、annotation関係のエラーが起きた場合には、JDKのアップデートを考慮してほしい。

0.6.0リリース。

長い道のりであったが、0.6.0をリリースした。 Maven coordinateは以下のとおり。

    <dependency>
      <groupId>com.github.dakusui</groupId>
      <artifactId>jcunit</artifactId>
      <version>[0.6.0,)</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

古いJUnitを使っていると実行時にエラーが出るようなので、JUnitについての依存もバージョンを指定するほうがよいようだ。 今回の新機能は以下の通り。

自分で言うのもなんだが、かなり「使える」水準になってきたと思う。 特にネガティブテストの自動生成は便利だ。

ということで、以前見つけた正規表現逆生成ライブラリxegerのテストを作ってみた。こちら

@RunWith(JCUnit.class)
public class XegerTest {
  @FactorField(stringLevels = {
      ".",
      "A",
      "[A]",
      "[AB]",
      "[A-C]"
  })
  public String characterClass1;

  @FactorField(stringLevels = {
      "?",
      "*",
      "+",
      "{1,2}",
      "{1,3}",
      "{2,3}" })
  public String quantifier1;

  @FactorField(stringLevels = {
      "a",
      "[a]",
      "[ab]",
      "[a-c]" })
  public String characterClass2;

  @FactorField(stringLevels = {
      "?",
      "*",
      "+",
      "{1,2}",
      "{1,3}",
      "{2,3}" })
  public String quantifier2;

  /**
   * 0 ... characterClass1
   * 1 ... quantifier1
   * 2 ... characterClass2
   * 3 ... quantifier2
   */
  @FactorField(stringLevels = {
      "{0}{1}{2}{3}",
      " ({0}{1}{2}){3}",
      " ({0}{1}|{2}){3}",
      " (({0}|{2}){1}){3}"
  })
  public String structure;

  @Test
  public void shouldGenerateTextsThatMatchOriginalRegex() {
    String regex = this.composeRegex();
    Xeger generator = new Xeger(regex, new Random(1));
    for (int i = 0; i < 100; i++) {
      String text = generator.generate();
      assertTrue(
          String.format("Generated text '%s' didn't match regex '%s", text, regex),
          Pattern.compile(
              regex
          ).matcher(text).matches());
    }
  }

  @Test
  public void shouldBeRepeatable() throws InterruptedException {
    int tries = 100;
    int seed = 1;
    String regex = this.composeRegex();
    List<String> first = new ArrayList<String>(tries);
    {
      Xeger generator1 = new Xeger(regex, new Random(seed));
      for (int i = 0; i < tries; i++) {
        first.add(generator1.generate());
      }
    }
    TimeUnit.MILLISECONDS.sleep(1);
    List<String> second = new ArrayList<String>(tries);
    {
      Xeger generator2 = new Xeger(regex, new Random(seed));
      for (int i = 0; i < tries; i++) {
        second.add(generator2.generate());
      }
    }
    assertTrue(
        String.format("Xeger didn't return the same result in spite that the same pattern and seed were given:(pattern=%s, seed=%s)", regex, seed),
        first.equals(second));
  }

  String composeRegex() {
    return MessageFormat.format(
        this.structure,
        this.characterClass1, this.quantifier1,
        this.characterClass2, this.quantifier2
    );
  }
}

こんな風にテストを作るといい感じに2つほどバグが見つかる。

また、今回からドキュメントはWikiにまとめることにした。

github.com

機能追加、改善の要望がもしあれば、

Issues · dakusui/jcunit · GitHub

またはこのブログのコメントにでも寄せてほしい。

0.6.0-alpha

JCUnit 0.6.0 alphaをリリースしてみた。 今回の主要な変更は以下の通り。

  1. カバレッジレポーティング機能
  2. FSM(有限状態機械)の入力履歴検査機能 (InteractionHistory)
  3. リファクタリング
  4. 各種プラグインの構造改善
  5. リクエストのあった生成されたテストスイートの再利用機能

MavenのCoordinateは以下の通り。

    <dependency>
      <groupId>com.github.dakusui</groupId>
      <artifactId>jcunit</artifactId>
      <version>0.6.0-alpha</version>
    </dependency>

今回から、ドキュメントはgithub wikiで管理・公開することにした。

Home · dakusui/jcunit Wiki · GitHub

まだリンク切れがあるが、正式公開までに直したい。

Mapの変更

コードのある場所でTreeMapLinkedHashMapに変えてみた。 すると、

    benchmark1_3$4                          :(testcases, remainders, time(sec))=(   9,    0, 0.0)
    benchmark2_3$13                         :(testcases, remainders, time(sec))=(  24,    0, 0.03)
    benchmark3_4$15_3$17_2$20               :(testcases, remainders, time(sec))=(  39,    0, 3.053)
    benchmark4_4$1_3$30_2$35                :(testcases, remainders, time(sec))=(  30,    0, 6.654)
    benchmark5_2$100                        :(testcases, remainders, time(sec))=(  18,    0, 17.904)
    benchmark6_10$20                        :(testcases, remainders, time(sec))=( 244,    0, 2.58)

以前、行った比較は以下で

jcunit.hatenablog.jp

横に並べてみるとこうなる

# Task TreeMap LinkedHashMap
1 3(4) 9 9
2 3(13) 25 24
3 4(15)+3(17)+2(20) 41 39
4 4(1)+3(30)+2(35) 31 30
5 2(100) 18 18
6 10(20) 273 244

わずかながらテストスイートのサイズが小さくなっている。 原因はいろいろ考えられるが、興味深いことだ。

問題がないことを確信できたら、LinkedHashMapに変更することにしよう。

IntelliJはParameterizedテストランナーを特別扱いする

@Suiteのついたテストクラスはまとめていろんなクラスにあるテストを実行する。このいろんなクラスというのはSuiteの「子」としてJUnitに扱われる。 @Suiteアノテーションがつけられたクラスの中のあるメソッドIntelliJのテスト結果画面から選択すると、選ばれたメソッドが属するクラスの選ばれたメソッドを実行する。このとき、@Suiteがついたクラス(親側のクラス)はもう関係ない。 このアプローチがうまく行くのは「子」が静的なクラスだからだ。

    @RunWith(Suite.class)
    @Suite.SuiteClasses({ExampleSuite.Test1.class, ExampleSuite.Test2.class})
    public class ExampleSuite {
      public static class Test1 {

ためしに、こういのを作ってみるといい。static修飾子をTest1から取り去るとテストが動かなくなってしまうのがわかる。

ところでParameterizedもSuiteの一種なのだ。 だが、通常のSuiteと異なり、

    
    // Parameterized.Parameters
    new Object[]{
       {"test1", "hello", "world"}, // 0
       {"test2", "scott", "tiger"}  // 1
    }

のような二重配列の中の一個一個の配列(=テストケース)例えば{"test1", "hello", "world"}が「子」に対応するだ。これらからParameterized#createRunnersForChildrenによってテストランナーが生成され、Parameterizedオブジェクトに登録される。 そして、これを一個一個別の静的クラスにすることはできない。動的に静的なクラスを作ることはできませんよね?

IntelliJ@Parameterizedテストのメソッドを個別に実行するように要求されると、実行クラスはSuiteとなる親のクラス(つまり@Parameterizedがついたクラス)、メソッドは指定されたものを実行する。 これだけでは一体、何番目のテストケースを実行するのかわからない。

ではどうするか?プログラム引数として[0]とか[1]とかを渡すのだ。 これがJUnitの側で解釈されて何番目のテストケースが実行されるかが決まる。

なるほど。

で、JCUnit。JCUnitのランナーはこのParameterizedランナーの仕組みに"則って"作られている。"則って"というのは真似して、という意味だ。Parameterizedを継承していないのだ

だから、JCUnitのテスト結果画面から、テストメソッドを一個だけ選んで実行しようとしても動かない。IntelliJがParameterizedだと認識してくれないから、プログラム引数に[1]とか[10]とかをくれないのだ。 Parameterized#createRunnersForChildrenをオーバーライドすればそれで仕事は終わりなのに、なぜか?

createRunnersForChildrenprivateだからだ。ふざけんな。

じゃ、どうするか?ずいぶん前にぐちゃぐちゃ工夫したのだが、実行したいテストメソッド名がtestMethodだとしたらIntelliJの実行ダイアログでメソッド名の欄をtestMethod[10]とかに変更してみてほしい。10番目のテストが実行されるはずだ。

しかし、ブログは書いてみるもので、アタマが整理されてうまいインチキを思いついた。 試してみてうまく行ったら、後日報告することにしたい。