Reference Job
      Testfälle:
      Der Status soll überprüft werden nachdem die Issues zwischen dem aktuellem Build und dem vorherigen verglichen wurden.
      Dabei müssen alle möglichen Ausgangszustände einberüchsichtigt werden. (Die Einstellungen im Build:

      • Ignore Previous Result
      • Overall Success
      • Reference Job - Vergleich mit einem anderen Jenkins Job)

          [JENKINS-50084] Integration Test for ReferenceFinder

          Arne Schöntag added a comment - - edited

          Testfälle, die mir spontan eingefallen sind in die Description hinzugefügt.

          Arne Schöntag added a comment - - edited Testfälle, die mir spontan eingefallen sind in die Description hinzugefügt.

          Wie kann ich auf die Ergebnisse des ReferenceFinders (Dem Vergleich zum Vorherigen Build) zugreifen?

          Arne Schöntag added a comment - Wie kann ich auf die Ergebnisse des ReferenceFinders (Dem Vergleich zum Vorherigen Build) zugreifen?

          Ulli Hafner added a comment - - edited

          Dazu langt es, das Ergebnis (d.h. in der Instanz des AnalysisResult) der Methode

              /**
               * Returns the reference static analysis run that has been used to compute the new issues.
               *
               * @return the reference build
               */
              public Optional<Run<?, ?>> getReferenceBuild() {
                  if (referenceJob == NO_REFERENCE) {
                      return Optional.empty();
                  }
                  return new JenkinsFacade().getBuild(referenceJob, referenceBuild);
              }
          

          auszuwerten. Dort sollte der entsprechende Build drin stehen.

          Ulli Hafner added a comment - - edited Dazu langt es, das Ergebnis (d.h. in der Instanz des AnalysisResult) der Methode /** * Returns the reference static analysis run that has been used to compute the new issues. * * @ return the reference build */ public Optional<Run<?, ?>> getReferenceBuild() { if (referenceJob == NO_REFERENCE) { return Optional.empty(); } return new JenkinsFacade().getBuild(referenceJob, referenceBuild); } auszuwerten. Dort sollte der entsprechende Build drin stehen.

          Arne Schöntag added a comment - - edited

          Wie kann ich, wenn ich einen neuen Build baue einen Reference Job hinzufügen?
          Mit addProperty()? Was für eine JobProperty muss ich da setzten?
          Bzw. Wie kann ich algemein die Felder für den Reference Build konfigurieren (Im Test)?

          Arne Schöntag added a comment - - edited Wie kann ich, wenn ich einen neuen Build baue einen Reference Job hinzufügen? Mit addProperty()? Was für eine JobProperty muss ich da setzten? Bzw. Wie kann ich algemein die Felder für den Reference Build konfigurieren (Im Test)?

          Ulli Hafner added a comment - - edited

          Der Reference Job hat nichts mit dem Bauen zu tun, das muss im Recorder gesetzt werden.

          Das Setzen können Sie analog zu einem der bestehenden Tests machen.  Diese Parameter im Test am einfachsten als Lambda übergeben (siehe publisher Variable unten):

              /**
               * Sets the UNSTABLE threshold to 8 and parse a file that contains exactly 8 warnings: the build should be unstable.
               */
              @Test
              public void shouldCreateUnstableResult() {
                  FreeStyleProject project = createJobWithWorkspaceFile("eclipse.txt");
                  enableWarnings(project, publisher -> publisher.setUnstableTotalAll(7));
          
                  AnalysisResult result = scheduleBuildAndAssertStatus(project, Result.UNSTABLE);
          
                  assertThat(result).hasTotalSize(8);
                  assertThat(result).hasStatus(Status.WARNING);
          
                  HtmlPage page = getWebPage(result);
                  assertThat(page.getElementsByIdAndOrName("statistics")).hasSize(1);
              }
          
          

          Welche Setter Sie Nutzen können, sehen Sie in der Klasse IssuesRecorder.

          Folgende drei Setter sind verfügbar:

              /**
               * If {@code true} then the result of the previous analysis run is ignored when searching for the reference,
               * otherwise the result of the static analysis reference must be {@link Result#SUCCESS}.
               *
               * @param ignoreAnalysisResult
               *         if {@code true} then the previous build is always used
               */
              @DataBoundSetter
              public void setIgnoreAnalysisResult(final boolean ignoreAnalysisResult) {
                  this.ignoreAnalysisResult = ignoreAnalysisResult;
              }
          
          
              /**
               * If {@code true} then only runs with an overall result of {@link Result#SUCCESS} are considered as a reference,
               * otherwise every run that contains results of the same static analysis configuration is considered.
               *
               * @param overallResultMustBeSuccess
               *         if {@code true} then a stable build is used as reference
               */
              @DataBoundSetter
              public void setOverallResultMustBeSuccess(final boolean overallResultMustBeSuccess) {
                  this.overallResultMustBeSuccess = overallResultMustBeSuccess;
              }
          
              /**
               * Sets the reference job to get the results for the issue difference computation.
               *
               * @param referenceJobName
               *         the name of reference job
               */
              @DataBoundSetter
              public void setReferenceJobName(final String referenceJobName) {
                  if (NO_REFERENCE_JOB.equals(referenceJobName)) {
                      this.referenceJobName = StringUtils.EMPTY;
                  }
                  this.referenceJobName = referenceJobName;
              }
          

           

           

          Ulli Hafner added a comment - - edited Der Reference Job hat nichts mit dem Bauen zu tun, das muss im Recorder gesetzt werden. Das Setzen können Sie analog zu einem der bestehenden Tests machen.  Diese Parameter im Test am einfachsten als Lambda übergeben (siehe publisher Variable unten): /** * Sets the UNSTABLE threshold to 8 and parse a file that contains exactly 8 warnings: the build should be unstable. */ @Test public void shouldCreateUnstableResult() { FreeStyleProject project = createJobWithWorkspaceFile( "eclipse.txt" ); enableWarnings(project, publisher -> publisher.setUnstableTotalAll(7)); AnalysisResult result = scheduleBuildAndAssertStatus(project, Result.UNSTABLE); assertThat(result).hasTotalSize(8); assertThat(result).hasStatus(Status.WARNING); HtmlPage page = getWebPage(result); assertThat(page.getElementsByIdAndOrName( "statistics" )).hasSize(1); } Welche Setter Sie Nutzen können, sehen Sie in der Klasse IssuesRecorder . Folgende drei Setter sind verfügbar: /** * If {@code true } then the result of the previous analysis run is ignored when searching for the reference, * otherwise the result of the static analysis reference must be {@link Result#SUCCESS}. * * @param ignoreAnalysisResult * if {@code true } then the previous build is always used */ @DataBoundSetter public void setIgnoreAnalysisResult( final boolean ignoreAnalysisResult) { this .ignoreAnalysisResult = ignoreAnalysisResult; } /** * If {@code true } then only runs with an overall result of {@link Result#SUCCESS} are considered as a reference, * otherwise every run that contains results of the same static analysis configuration is considered. * * @param overallResultMustBeSuccess * if {@code true } then a stable build is used as reference */ @DataBoundSetter public void setOverallResultMustBeSuccess( final boolean overallResultMustBeSuccess) { this .overallResultMustBeSuccess = overallResultMustBeSuccess; } /** * Sets the reference job to get the results for the issue difference computation. * * @param referenceJobName * the name of reference job */ @DataBoundSetter public void setReferenceJobName( final String referenceJobName) { if (NO_REFERENCE_JOB.equals(referenceJobName)) { this .referenceJobName = StringUtils.EMPTY; } this .referenceJobName = referenceJobName; }    

          Arne Schöntag added a comment - - edited

          Wenn ich folgendes laufen lasse:

                  FreeStyleProject project = createJobWithWorkspaceFile(jobName, "eclipse.txt");
                  IssuesRecorder recorder = enableWarnings(project, publisher -> {
                      publisher.setUnstableTotalAll(7);
                  });
          
                  AnalysisResult result = scheduleBuildAndAssertStatus(project, Result.UNSTABLE);
                  assertThat(result).hasTotalSize(8);
                  assertThat(result).hasOverallResult(Result.UNSTABLE);
          
                  recorder.setUnstableTotalAll(0);
          
                  result = scheduleBuildAndAssertStatus(project, Result.SUCCESS);
                  assertThat(result).hasOverallResult(Result.UNSTABLE);
                  
                  assertThat(result).hasNewSize(0);
          

          bekomme ich ein SUCCESS build beim zweiten Mal, dass 8 Issues hat. Warum kommt da ein SUCCESS zurück, obwohl der vorherige Build UNSTABLE (ignoreAnalysisResult ist standardmäßig false) war? Das assertThat danach schlägt demnach fehl.
          Wie kann ich noch die Issues "fixen", dass beim zweiten build weniger vorhanden sind?

          Arne Schöntag added a comment - - edited Wenn ich folgendes laufen lasse: FreeStyleProject project = createJobWithWorkspaceFile(jobName, "eclipse.txt" ); IssuesRecorder recorder = enableWarnings(project, publisher -> { publisher.setUnstableTotalAll(7); }); AnalysisResult result = scheduleBuildAndAssertStatus(project, Result.UNSTABLE); assertThat(result).hasTotalSize(8); assertThat(result).hasOverallResult(Result.UNSTABLE); recorder.setUnstableTotalAll(0); result = scheduleBuildAndAssertStatus(project, Result.SUCCESS); assertThat(result).hasOverallResult(Result.UNSTABLE); assertThat(result).hasNewSize(0); bekomme ich ein SUCCESS build beim zweiten Mal, dass 8 Issues hat. Warum kommt da ein SUCCESS zurück, obwohl der vorherige Build UNSTABLE (ignoreAnalysisResult ist standardmäßig false) war? Das assertThat danach schlägt demnach fehl. Wie kann ich noch die Issues "fixen", dass beim zweiten build weniger vorhanden sind?

          Ulli Hafner added a comment -

          recorder.setUnstableTotalAll(0); deaktiviert das QualityGate. Eine 1 aktiviert es bei mindestens einer Warnung.

          Issues fixed geht am einfachsten, durch Duplizieren der Datei und löschen einiger Warnungen. Dann den zweiten Build auf die andere Datei loslassen.

          Ulli Hafner added a comment - recorder.setUnstableTotalAll(0); deaktiviert das QualityGate. Eine 1 aktiviert es bei mindestens einer Warnung. Issues fixed geht am einfachsten, durch Duplizieren der Datei und löschen einiger Warnungen. Dann den zweiten Build auf die andere Datei loslassen.

          2 Bugs:

          1.) Bei MustBeOverallSuccess false ignoriert er alle Failures obwohl die Überprüfung der IssueRecorder ein Success zurück liefert.

          BuildHistory.java

          Z. 104 isBetter -> isBetterOrEqual

          2.) Wenn ein ReferenceJob angegeben ist, nimmt er immer den aktuellen (baseline) als Reference und nicht abhängig vom Buildstatus (ignore Previous Result hat dort keinen Einfluss)

          Siehe:

          OtherJobReferenceFinder.java

          Z. 47

          Arne Schöntag added a comment - 2 Bugs: 1.) Bei MustBeOverallSuccess false ignoriert er alle Failures obwohl die Überprüfung der IssueRecorder ein Success zurück liefert. BuildHistory.java Z. 104 isBetter -> isBetterOrEqual 2.) Wenn ein ReferenceJob angegeben ist, nimmt er immer den aktuellen (baseline) als Reference und nicht abhängig vom Buildstatus (ignore Previous Result hat dort keinen Einfluss) Siehe: OtherJobReferenceFinder.java Z. 47

            arne2 Arne Schöntag
            drulli Ulli Hafner
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: