memorizing data between tests

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

memorizing data between tests

Ben Coman
Say I want to write ten tests for different aspects of a web service point.
Apart from the risk of relying on an external service, 
I'd like to poll the web service once rather than ten times.
I wondering about the feasibility of memorizing data between test methods.
Taking for example...
     TestCase subclass: #MyTest ...

My understanding is that MyTest >> setUp is run once per test method.
What I guess is missing is a #groupSetup that would be called at the start of a running a group of tests.

MyTest >> groupSetup
    memorized := Dictionary new.

MyTest >> getLiveDataOncePerRun
    ^ memorized at: 'data' ifAbsentPut: [ZnClient new get: 'http://someservice.com/liveData1'.

MyTest >> test1
    |data|
    data  := self  getLiveDataOncePerRun  .
    self assert: data result1 equals: 'expected result 1'

MyTest >> test2
    |data|
    data  := self  getLiveDataOncePerRun.
    self assert: data result2 equals: 'expected result 2'

cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: memorizing data between tests

Peter Uhnak
Hi Ben,

take a look at TestResource (its comment and subclasses). It should do what you are looking for.

Peter

On Sun, Sep 9, 2018 at 8:08 AM Ben Coman <[hidden email]> wrote:
Say I want to write ten tests for different aspects of a web service point.
Apart from the risk of relying on an external service, 
I'd like to poll the web service once rather than ten times.
I wondering about the feasibility of memorizing data between test methods.
Taking for example...
     TestCase subclass: #MyTest ...

My understanding is that MyTest >> setUp is run once per test method.
What I guess is missing is a #groupSetup that would be called at the start of a running a group of tests.

MyTest >> groupSetup
    memorized := Dictionary new.

MyTest >> getLiveDataOncePerRun
    ^ memorized at: 'data' ifAbsentPut: [ZnClient new get: 'http://someservice.com/liveData1'.

MyTest >> test1
    |data|
    data  := self  getLiveDataOncePerRun  .
    self assert: data result1 equals: 'expected result 1'

MyTest >> test2
    |data|
    data  := self  getLiveDataOncePerRun.
    self assert: data result2 equals: 'expected result 2'

cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: memorizing data between tests

Ben Coman
That seems to be exactly what I'm looking for. Thanks Peter.
cheers -ben

On Sun, 9 Sep 2018 at 16:11, Peter Uhnak <[hidden email]> wrote:
Hi Ben,

take a look at TestResource (its comment and subclasses). It should do what you are looking for.

Peter

On Sun, Sep 9, 2018 at 8:08 AM Ben Coman <[hidden email]> wrote:
Say I want to write ten tests for different aspects of a web service point.
Apart from the risk of relying on an external service, 
I'd like to poll the web service once rather than ten times.
I wondering about the feasibility of memorizing data between test methods.
Taking for example...
     TestCase subclass: #MyTest ...

My understanding is that MyTest >> setUp is run once per test method.
What I guess is missing is a #groupSetup that would be called at the start of a running a group of tests.

MyTest >> groupSetup
    memorized := Dictionary new.

MyTest >> getLiveDataOncePerRun
    ^ memorized at: 'data' ifAbsentPut: [ZnClient new get: 'http://someservice.com/liveData1'.

MyTest >> test1
    |data|
    data  := self  getLiveDataOncePerRun  .
    self assert: data result1 equals: 'expected result 1'

MyTest >> test2
    |data|
    data  := self  getLiveDataOncePerRun.
    self assert: data result2 equals: 'expected result 2'

cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: memorizing data between tests

Esteban A. Maringolo
In reply to this post by Peter Uhnak
You can use a TestResource for it, and use some sort of memoization.

I don't know if there is a library for memoization in Pharo, but if
the HTTP calls are not that many you can implement it by having a
cache in the test resource, implemented as a dictionary, with the URL
as key and its cached response as value.

Regards,

Esteban A. Maringolo

El dom., 9 sept. 2018 a las 5:11, Peter Uhnak (<[hidden email]>) escribió:

>
> Hi Ben,
>
> take a look at TestResource (its comment and subclasses). It should do what you are looking for.
>
> Peter
>
> On Sun, Sep 9, 2018 at 8:08 AM Ben Coman <[hidden email]> wrote:
>>
>> Say I want to write ten tests for different aspects of a web service point.
>> Apart from the risk of relying on an external service,
>> I'd like to poll the web service once rather than ten times.
>> I wondering about the feasibility of memorizing data between test methods.
>> Taking for example...
>>      TestCase subclass: #MyTest ...
>>
>> My understanding is that MyTest >> setUp is run once per test method.
>> What I guess is missing is a #groupSetup that would be called at the start of a running a group of tests.
>>
>> MyTest >> groupSetup
>>     memorized := Dictionary new.
>>
>> MyTest >> getLiveDataOncePerRun
>>     ^ memorized at: 'data' ifAbsentPut: [ZnClient new get: 'http://someservice.com/liveData1'.
>>
>> MyTest >> test1
>>     |data|
>>     data  := self  getLiveDataOncePerRun  .
>>     self assert: data result1 equals: 'expected result 1'
>>
>> MyTest >> test2
>>     |data|
>>     data  := self  getLiveDataOncePerRun.
>>     self assert: data result2 equals: 'expected result 2'
>>
>> cheers -ben
>>