If you need actual interruption then as said you need to use the
mechanisms that pytest-timeout uses.  But bear in mind that they come
with lots of caveats about how they work.  Short of an external
process supervisor which does `kill -9` nothing is ever guaranteed to
stop your test run.  But depending on what sort of things do
pytest-timeout could be perfectly fine.

I'd be perfectly fine with adding a `--global-timeout` option to
pytest-timeout if you would like to submit a pull request.  That's
probably easier then starting to re-implement that interrupting
behaviour from scratch.

Regards,
Floris



On 20 April 2016 at 13:07, Shankar Hiremath
<[email protected]> wrote:
> Hi Bruno,
>
> I tried with the below approach provided by you, when i increase the sleep
> time inside the test_foo to 10 sec,  then the test execution took 20.12 sec
> and then after further test case execution stooped.
>
> but what i required is to stop the test itself instead of waiting for the
> test to complete (in this case 10 sec sleep), i agree for this case
> pytest-timeout is the best option.
>
> My use case is little bit different: whenever there is a new commit, i am
> going to run smoke tests which are annotated with “pytest.mark.smoke”
> annotation in pytest (around 400 test cases)
> when the new commit code quality is of good then all of the smoke tests will
> get completed well within 2 hours duration, when there is a product issue
> due to new commit randomly few of the tests might get hanged for some time
> due to that, the overall test execution will take > 2hours.
>
> 1) if all tests passed well within 2 hour duration i will say “+1” to the
> commit,
> 2) if any test failed & all are well within 2 hour duration all tests
> completed i will say “-1” to the commit,
> 3) if tests are taking more time >2 hours or any test hanged, i want to stop
> the current running test & stop further test execution, i will say “-1” to
> the commit,
>
> Inorder to achieve the case-3, i need to have some mechanism of global
> timeout of 2 hours (i am ok with +/- 5 minutes difference accuracy) from
> pytest execution.
> Any suggestion or approach to achieve this will very helpful. Thanks in
> advance.
>
> def pytest_sessionstart(session):
>     session.start_time = time.time()
>
> @pytest.fixture(autouse=True)
> def check_session_time(request):
>     elapsed = time.time() - request.session.start_time
>     if elapsed > 1.0:
>         request.session.shouldstop = 'time limit reached: %0.2f seconds' %
> elapsed
>
> @pytest.mark.parametrize('i', range(10))
> def test_foo(i):
>     time.sleep(10)
>
>
> The output of pytest execution is as below:
>
> ================================================= test session starts
> =================================================
> platform linux2 -- Python 2.7.6 -- py-1.4.31 -- pytest-2.6.2
> plugins: timeout
> collected 10 items
>
> a.py ..
>
> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: time limit reached: 10.02
> seconds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
> ============================================== 2 passed in 20.12 seconds
> =============================================
>
>
> Thanks
> -Shankar
>
>
> On Apr 19, 2016, at 9:22 PM, Shankar Hiremath
> <[email protected]> wrote:
>
> Hi Bruno,
>
> Thanks a lot, this meets my requirement. I will go ahead with the approach
> provided by you.
>
> Regards
> -Shankar
>
> On Mon, Apr 18, 2016 at 6:56 PM, Bruno Oliveira <[email protected]>
> wrote:
>>
>> Hi Shankar,
>>
>> I don’t know of any plugin that does this out of the box, but the simplest
>> way I found is to implement this is using an auto-use fixture:
>>
>> # contents of conftest.py
>> import pytest
>> import time
>>
>> def pytest_sessionstart(session):
>>     session.start_time = time.time()
>>
>> @pytest.fixture(autouse=True)
>> def check_session_time(request):
>>     elapsed = time.time() - request.session.start_time
>>     if elapsed > 1.0:
>>         request.session.shouldstop = 'time limit reached: %0.2f seconds' %
>> elapsed
>>
>> # contents of test_foo.py
>> import pytest
>> import time
>>
>> @pytest.mark.parametrize('i', range(10))
>> def test_foo(i):
>>     time.sleep(0.5)
>>
>> Running this produces:
>>
>> collected 10 items
>>
>> test_foo.py ...
>>
>> !!!!!!!!!!!!!!!! Interrupted: time limit reached: 1.11 seconds
>> !!!!!!!!!!!!!!!!
>> ========================== 3 passed in 1.69 seconds
>> ===========================
>>
>> Hope that helps.
>>
>> Cheers,
>> Bruno.
>>
>>
>> On Mon, Apr 18, 2016 at 8:56 AM Shankar Hiremath
>> <[email protected]> wrote:
>>>
>>> Hi All,
>>>
>>> Is there any any plugin similar to "pytest-timeout” but at higher level
>>> (ex: complete suite level execution timeout)
>>>
>>> My requirement is to run pytest with test suites and if all tests
>>> finishes well within the 2 hours time duration then its good, else I want to
>>> stop the test execution.
>>> ( I mean stop the current running test & further tests if any,  but the
>>> pytest call backs should get executed, for example: pytest_sessionfinish
>>> need to be executed, before exiting pytest)
>>>
>>> Please suggest me if any existing plugins provides this feature, or any
>>> easy way to achieve this feature in pytest.
>>>
>>> Thanks
>>> -Shankar
>>> _______________________________________________
>>> pytest-dev mailing list
>>> [email protected]
>>> https://mail.python.org/mailman/listinfo/pytest-dev
>
>
>
>
> _______________________________________________
> pytest-dev mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/pytest-dev
>
_______________________________________________
pytest-dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-dev

Reply via email to