Modularization of Feature Methods

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Modularization of Feature Methods

Fredy
Hi all!

We have some testscenario, collection of some given when then things.
In the moment, we define one testcase == one feature method. now we want to reuse some blocks or some sequences of blocks.
That should be possible with the Stepwise Extension! But does it work with inheritance? and if, how?

I hope the following pseudo code will explain my thoughts:

@Stepwise
class MySpec extends Specification{
    def "process task A"(){
      
        given: "a task of type a"
            a = new task()
       
        when: "task is processed"
            systemATaskProcessor.process()
           
        then: "task is completed"
            a.isComplete()
    }
   
    def "process task B"(){
       
        given: "a task of type b"
            b = new bTask()
       
        when: "task is processed"
            systemBTaskProcessor.process()
           
        then: "task is completed"
            b.isComplete()
    }
}

@Stepwise
class MyOtherSpec extends MySpec{

    def "process task A"(){
       
        given: "a task of type a"
            a = new task()
       
        when: "task is processed"
            systemATaskProcessor.process()
           
        then: "task is completed"
            a.isComplete()
    }
   
   
    def "process task A1"(){
       
    .......
    }
   
   
    def "process task B"(){
       
        given: "a task of type b"
            b = new bTask()
       
        when: "task is processed"
            systemBTaskProcessor.process()
           
        then: "task is completed"
            b.isComplete()

    }
}

@Stepwise
class My2ndOtherSpec extends MySpec{

    def "process task A"(){
       
        given: "a task of type a"
            a = new task()
       
        when: "task is processed"
            systemATaskProcessor.process()
           
        then: "task is completed"
            a.isComplete()
    }
   
   
    def "process task A2"(){
       
    .......
    }
   
   
    def "process task B"(){
       
        given: "a task of type b"
            b = new bTask()
       
        when: "task is processed"
            systemBTaskProcessor.process()
           
        then: "task is completed"
            b.isComplete()

    }
}


Any idea ??
Thanks!

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Kostis Kapelonis
Hello

I am not sure that your pseudocode is clear. You say that you "want to
reuse some blocks or some sequences of blocks" but I see that both
MyOtherSpec and My2ndOtherSpec redefine "process task A" and "process
task B". So where is the code re-use? Am I missing something?
Your example would work correctly without the class MySpec. With the
StepWize annotation you could verify correctly the sequence A-A1-B and
A-A2-B using just the two other classes (if that is what you are
after)

Perhaps you can explain a bit more on your real world case and what
you are trying to accomplish.

If A and B are just two tasks that need to run always at the beginning
and the end of every test method, then just put the code directly at
setup()/cleanup methods.
No need to test them every time.

Inheritance among test cases is usually employed in order to share
setup and verification code, not to run the same test methods again
and again.

Kostis


On Mon, Jun 22, 2015 at 2:15 PM, Fredy <[hidden email]> wrote:

> Hi all!
>
> We have some testscenario, collection of some given when then things.
> In the moment, we define one testcase == one feature method. now we want to
> reuse some blocks or some sequences of blocks.
> That should be possible with the Stepwise Extension! But does it work with
> inheritance? and if, how?
>
> I hope the following pseudo code will explain my thoughts:
>
> @Stepwise
> class MySpec extends Specification{
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>     }
> }
>
> @Stepwise
> class MyOtherSpec extends MySpec{
>
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>
>     def "process task A1"(){
>
>     .......
>     }
>
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>
>     }
> }
>
> @Stepwise
> class My2ndOtherSpec extends MySpec{
>
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>
>     def "process task A2"(){
>
>     .......
>     }
>
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>
>     }
> }
>
> Any idea ??
> Thanks!
>
> --
> You received this message because you are subscribed to the Google Groups
> "Spock Framework - User" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [hidden email].
> To post to this group, send email to [hidden email].
> Visit this group at http://groups.google.com/group/spockframework.
> For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Fredy
Hi Kostis,
you are right, the pseudo code is ambiguous.
I won't duplicate the codeblocks "process task A" and "process task B" ! That was a try to clearify my problem -> failed ;-)

So the solution should look like:

@Stepwise
class MyOtherSpec extends MySpec{

    "process task A"()
     
    def "process task A1"(){
    .......
    }
  
    "process task B"()
}

@Stepwise
class My2ndOtherSpec extends MySpec{

    "process task A"()

    def "process task A2"(){
    .......
    }
  
    "process task B"()
}


"Perhaps you can explain a bit more on your real world case and what you are trying to accomplish. "
-> That is not always so easy if you should not talk about the business of your employer.

We want to do integration tests for complex useCases that run over 3 to 4 systems. There are batch jobs and webservice calls included.
Some scenarios when/then, when/then, ... are included in more than one useCase or we do different testcases for the same useCase and have to
include this scenarios in all the testcases. (on different positions, so setup/cleanup is not possible).
Put the reusable scenarios in Helper Classes is not possible, because we want to use the spock blocks for reporting.

"not to run the same test methods again and again." You are right, that is redundant, but the generated reports have to include these redundant things. In our own reports we want to generate a kind of user story with dynamic variables. So we have to rerun the same scenario again and again. Depending on the situation after the "same test methods" has been called the system acts different and we have to go on with a testcase specific scenario. That are the reasons for reusing blocks/scenarios.

sample report:



<img style="" src="data:image/png;base64,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" alt="">
Thanks a lot for your fast answer
Fredy

Am Montag, 22. Juni 2015 21:55:35 UTC+2 schrieb Kostis Kapelonis:
Hello

I am not sure that your pseudocode is clear. You say that you "want to
reuse some blocks or some sequences of blocks" but I see that both
MyOtherSpec and My2ndOtherSpec redefine "process task A" and "process
task B". So where is the code re-use? Am I missing something?
Your example would work correctly without the class MySpec. With the
StepWize annotation you could verify correctly the sequence A-A1-B and
A-A2-B using just the two other classes (if that is what you are
after)

Perhaps you can explain a bit more on your real world case and what
you are trying to accomplish.

If A and B are just two tasks that need to run always at the beginning
and the end of every test method, then just put the code directly at
setup()/cleanup methods.
No need to test them every time.

Inheritance among test cases is usually employed in order to share
setup and verification code, not to run the same test methods again
and again.

Kostis


On Mon, Jun 22, 2015 at 2:15 PM, Fredy <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="0dSNZjsfC5MJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">haus...@...> wrote:

> Hi all!
>
> We have some testscenario, collection of some given when then things.
> In the moment, we define one testcase == one feature method. now we want to
> reuse some blocks or some sequences of blocks.
> That should be possible with the Stepwise Extension! But does it work with
> inheritance? and if, how?
>
> I hope the following pseudo code will explain my thoughts:
>
> @Stepwise
> class MySpec extends Specification{
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>     }
> }
>
> @Stepwise
> class MyOtherSpec extends MySpec{
>
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>
>     def "process task A1"(){
>
>     .......
>     }
>
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>
>     }
> }
>
> @Stepwise
> class My2ndOtherSpec extends MySpec{
>
>     def "process task A"(){
>
>         given: "a task of type a"
>             a = new task()
>
>         when: "task is processed"
>             systemATaskProcessor.process()
>
>         then: "task is completed"
>             a.isComplete()
>     }
>
>
>     def "process task A2"(){
>
>     .......
>     }
>
>
>     def "process task B"(){
>
>         given: "a task of type b"
>             b = new bTask()
>
>         when: "task is processed"
>             systemBTaskProcessor.process()
>
>         then: "task is completed"
>             b.isComplete()
>
>     }
> }
>
> Any idea ??
> Thanks!
>
> --
> You received this message because you are subscribed to the Google Groups
> "Spock Framework - User" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="0dSNZjsfC5MJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">spockframewor...@googlegroups.com.
> To post to this group, send email to <a href="javascript:" target="_blank" gdf-obfuscated-mailto="0dSNZjsfC5MJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">spockfr...@googlegroups.com.
> Visit this group at <a href="http://groups.google.com/group/spockframework" target="_blank" rel="nofollow" onmousedown="this.href='http://groups.google.com/group/spockframework';return true;" onclick="this.href='http://groups.google.com/group/spockframework';return true;">http://groups.google.com/group/spockframework.
> For more options, visit <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href='https://groups.google.com/d/optout';return true;" onclick="this.href='https://groups.google.com/d/optout';return true;">https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Fredy

Next try with the screenshot:

<img style="" src="data:image/png;base64,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" alt="">

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Fredy
In reply to this post by Kostis Kapelonis
Hi Kostis,
you are right, the pseudo code is ambiguous.
I won't duplicate the codeblocks "process task A" and "process task B" ! That was a try to clearify my problem -> failed ;-)

So the solution should look like:

@Stepwise
class MyOtherSpec extends MySpec{

    "process task A"()
     
    def "process task A1"(){
    .......
    }
 
    "process task B"()
}

@Stepwise
class My2ndOtherSpec extends MySpec{

    "process task A"()

    def "process task A2"(){
    .......
    }
 
    "process task B"()
}


"Perhaps you can explain a bit more on your real world case and what you are trying to accomplish. "
-> That is not always so easy if you should not talk about the business of your employer.

We want to do integration tests for complex useCases that run over 3 to 4 systems. There are batch jobs and webservice calls included.
Some scenarios when/then, when/then, ... are included in more than one useCase or we do different testcases for the same useCase and have to
include this scenarios in all the testcases. (on different positions, so setup/cleanup is not possible).
Put the reusable scenarios in Helper Classes is not possible, because we want to use the spock blocks for reporting.

"not to run the same test methods again and again." You are right, that is redundant, but the generated reports have to include these redundant things. In our own reports we want to generate a kind of user story with dynamic variables. So we have to rerun the same scenario again and again. Depending on the situation after the "same test methods" has been called the system acts different and we have to go on with a testcase specific scenario. That are the reasons for reusing blocks/scenarios.

sample report:

    <h1>MyTestCase</h1>
    <table>       
        <tr>
            <td><b>SETUP</b> New Customer with xyz Contract</br>
                  <p>
                    Customer 0815 was created with workorder 678.<br />
                    Contract 0816 was created with workorder 679.<br />
                    Contract has ...... with id 654<br/>
                  </p>
            </td>
        </tr>
        <tr>
            <td><br/><b>WHEN</b> The EventCreator was called,</br>
                  <p>
                    The <a href="someLink">Service</a> has created a xyz-Event (2274) for accountnumber: 0815,<br /> and contractWorkorderNumber: 687.<br />
                  </p>
            </td>
        </tr>   
        <tr>
            <td><br/><b>THEN</b> ....</br>
                  <p>
                ...
                  </p>
              </td>
          </tr>
          <tr>
            <td><br/><b>WHEN</b> ...</br>
                  <p>
                    .... and so on
                  </p>
            </td>
        </tr>   
        <tr>
            <td><br/><b>THEN</b> ....</br>
                  <p>
                ...
                  </p>
              </td>
          </tr>
    </table>




Thanks a lot for your fast answer
Fredy

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Fredy
In reply to this post by Kostis Kapelonis
Hi Kostis,
you are right, the pseudo code is ambiguous.
I won't duplicate the codeblocks "process task A" and "process task B" ! That was a try to clearify my problem -> failed ;-)

So the solution should look like:

@Stepwise
class MyOtherSpec extends MySpec{

    "process task A"()
    
    def "process task A1"(){
    .......
    }
 
    "process task B"()
}

@Stepwise
class My2ndOtherSpec extends MySpec{

    "process task A"()

    def "process task A2"(){
    .......
    }
 
    "process task B"()
}


"Perhaps you can explain a bit more on your real world case and what you are trying to accomplish. "
-> That is not always so easy if you should not talk about the business of your employer.

We want to do integration tests for complex useCases that run over 3 to 4 systems. There are batch jobs and webservice calls included.
Some scenarios when/then, when/then, ... are included in more than one useCase or we do different testcases for the same useCase and have to
include this scenarios in all the testcases. (on different positions, so setup/cleanup is not possible).
Put the reusable scenarios in Helper Classes is not possible, because we want to use the spock blocks for reporting.

"not to run the same test methods again and again." You are right, that is redundant, but the generated reports have to include these redundant things. In our own reports we want to generate a kind of user story with dynamic variables. So we have to rerun the same scenario again and again. Depending on the situation after the "same test methods" has been called the system acts different and we have to go on with a testcase specific scenario. That are the reasons for reusing blocks/scenarios.

sample report:

MyTestCase

SETUP New Customer with xyz Contract

Customer 0815 was created with workorder 678.
 Contract 0816 was created with workorder 679.
 Contract has ...... with id 654

WHEN The EventCreator was called,
 calling service xyz

THEN
The Service has created a xyz-Event (2274) for accountnumber: 0815,
 and contractWorkorderNumber: 687.

WHEN The Event Processor was called
Start Batch Jon xyz with executionid 67

THEN Event is in PROGRESS
The xyz-Event (2274) is in state PROGRESS

THEN and the system A was called
The xyz in systemn A for accountnumber: 0815 has changed like....

WHEN ...
...

THEN ...
...

and so on



Thanks a lot for your fast answer
Fredy

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Fredy
In reply to this post by Kostis Kapelonis
Hi Kostis,
no more reply ? Did you understand my situation? What do you think about it?

Fredy

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Modularization of Feature Methods

Kostis Kapelonis
Hello

As far as I know what you ask in not possible. The Stepwize annotation
is not that smart to understand class hierarchy and automatically nest
inherited methods to their "effective" order.

The only workaround I can think is to put into helper classes the
common code. But just the common code, not the whole Spock blocks (so
that reporting works correctly as you say)

Kostis

On Thu, Jun 25, 2015 at 9:50 AM, Fredy <[hidden email]> wrote:

> Hi Kostis,
> no more reply ? Did you understand my situation? What do you think about it?
>
> Fredy
>
> --
> You received this message because you are subscribed to the Google Groups
> "Spock Framework - User" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [hidden email].
> To post to this group, send email to [hidden email].
> Visit this group at http://groups.google.com/group/spockframework.
> For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Spock Framework - User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
Visit this group at http://groups.google.com/group/spockframework.
For more options, visit https://groups.google.com/d/optout.
Loading...