17
17
import time
18
18
from concurrent import futures
19
19
from datetime import datetime , timedelta
20
+ from unittest import SkipTest
20
21
21
22
import numpy
22
23
from scipy .stats import chi2_contingency
28
29
from qiskit .providers .ibmq .exceptions import IBMQBackendError
29
30
from qiskit .providers .ibmq .ibmqfactory import IBMQFactory
30
31
from qiskit .providers .ibmq .job .ibmqjob import IBMQJob
31
- from qiskit .providers .ibmq .job .exceptions import IBMQJobInvalidStateError
32
+ from qiskit .providers .ibmq .job .exceptions import IBMQJobInvalidStateError , JobError
32
33
from qiskit .test import slow_test
33
34
from qiskit .compiler import assemble , transpile
34
35
from qiskit .result import Result
35
36
36
37
from ..jobtestcase import JobTestCase
37
38
from ..decorators import (requires_provider , requires_qe_access ,
38
- run_on_device , requires_device )
39
+ slow_test_on_device , requires_device )
39
40
40
41
41
42
class TestIBMQJob (JobTestCase ):
@@ -81,9 +82,8 @@ def test_run_simulator(self, provider):
81
82
self .assertGreater (contingency1 [1 ], 0.01 )
82
83
self .assertGreater (contingency2 [1 ], 0.01 )
83
84
84
- @slow_test
85
- @requires_device
86
- def test_run_device (self , backend ):
85
+ @slow_test_on_device
86
+ def test_run_device (self , provider , backend ): # pylint: disable=unused-argument
87
87
"""Test running in a real device."""
88
88
qobj = assemble (transpile (self ._qc , backend = backend ), backend = backend )
89
89
shots = qobj .config .shots
@@ -152,7 +152,7 @@ def test_run_async_simulator(self, provider):
152
152
job_ids = [job .job_id () for job in job_array ]
153
153
self .assertEqual (sorted (job_ids ), sorted (list (set (job_ids ))))
154
154
155
- @run_on_device
155
+ @slow_test_on_device
156
156
def test_run_async_device (self , provider , backend ): # pylint: disable=unused-argument
157
157
"""Test running in a real device asynchronously."""
158
158
self .log .info ('submitting to backend %s' , backend .name ())
@@ -208,7 +208,6 @@ def test_cancel(self, provider):
208
208
209
209
qobj = assemble (transpile (self ._qc , backend = backend ), backend = backend )
210
210
job = backend .run (qobj )
211
- self .wait_for_initialization (job , timeout = 5 )
212
211
can_cancel = job .cancel ()
213
212
self .assertTrue (can_cancel )
214
213
self .assertTrue (job .status () is JobStatus .CANCELLED )
@@ -234,38 +233,50 @@ def test_retrieve_job(self, provider):
234
233
self .assertEqual (job .result ().get_counts (), retrieved_job .result ().get_counts ())
235
234
self .assertEqual (job .qobj ().to_dict (), qobj .to_dict ())
236
235
237
- @slow_test
238
236
@requires_device
239
237
@requires_provider
240
238
def test_retrieve_job_uses_appropriate_backend (self , backend , provider ):
241
239
"""Test that retrieved jobs come from their appropriate backend."""
242
- simulator_backend = provider .get_backend ('ibmq_qasm_simulator' )
243
- real_backend = backend
240
+ backend_1 = backend
241
+ # Get a second backend.
242
+ backend_2 = None
243
+ for backend_2 in provider .backends ():
244
+ if backend_2 .status ().operational and backend_2 .name () != backend_1 .name ():
245
+ break
246
+ if not backend_2 :
247
+ raise SkipTest ('Skipping test that requires multiple backends' )
244
248
245
- qobj_sim = assemble (
246
- transpile (self ._qc , backend = simulator_backend ), backend = simulator_backend )
247
- job_sim = simulator_backend .run (qobj_sim )
249
+ qobj_1 = assemble (
250
+ transpile (self ._qc , backend = backend_1 ), backend = backend_1 )
251
+ job_1 = backend_1 .run (qobj_1 )
248
252
249
- qobj_real = assemble (
250
- transpile (self ._qc , backend = real_backend ), backend = real_backend )
251
- job_real = real_backend .run (qobj_real )
253
+ qobj_2 = assemble (
254
+ transpile (self ._qc , backend = backend_2 ), backend = backend_2 )
255
+ job_2 = backend_2 .run (qobj_2 )
252
256
253
257
# test a retrieved job's backend is the same as the queried backend
254
- self .assertEqual (simulator_backend .retrieve_job (job_sim .job_id ()).backend ().name (),
255
- simulator_backend .name ())
256
- self .assertEqual (real_backend .retrieve_job (job_real .job_id ()).backend ().name (),
257
- real_backend .name ())
258
+ self .assertEqual (backend_1 .retrieve_job (job_1 .job_id ()).backend ().name (),
259
+ backend_1 .name ())
260
+ self .assertEqual (backend_2 .retrieve_job (job_2 .job_id ()).backend ().name (),
261
+ backend_2 .name ())
258
262
259
263
# test retrieve requests for jobs that exist on other backends throw errors
260
264
with self .assertWarns (Warning ) as context_manager :
261
265
self .assertRaises (IBMQBackendError ,
262
- simulator_backend .retrieve_job , job_real .job_id ())
266
+ backend_1 .retrieve_job , job_2 .job_id ())
263
267
self .assertIn ('belongs to' , str (context_manager .warning ))
264
268
with self .assertWarns (Warning ) as context_manager :
265
269
self .assertRaises (IBMQBackendError ,
266
- real_backend .retrieve_job , job_sim .job_id ())
270
+ backend_2 .retrieve_job , job_1 .job_id ())
267
271
self .assertIn ('belongs to' , str (context_manager .warning ))
268
272
273
+ # Cleanup
274
+ for job in [job_1 , job_2 ]:
275
+ try :
276
+ job .cancel ()
277
+ except JobError :
278
+ pass
279
+
269
280
@requires_provider
270
281
def test_retrieve_job_error (self , provider ):
271
282
"""Test retrieving an invalid job."""
0 commit comments