Running tests » History » Version 63
Brett Smith, 05/22/2024 08:26 PM
update Python section for pytest
1 | 1 | Tom Clegg | h1. Running tests |
---|---|---|---|
2 | |||
3 | 3 | Tom Clegg | {{toc}} |
4 | |||
5 | 33 | Ward Vandewege | The arvados git repository has a @run-tests.sh@ script which tests (nearly) all of the components in the source tree. Jenkins at https://ci.arvados.org uses this exact script, so running it _before pushing a new master_ is a good way to predict whether Jenkins will fail your build and start pestering you by IRC. |
6 | 1 | Tom Clegg | |
7 | h2. Background |
||
8 | |||
9 | You have the arvados source tree at @~/arvados@ and you might have local modifications. |
||
10 | |||
11 | h2. Install prerequisites |
||
12 | |||
13 | 29 | Tom Clegg | Follow instructions at [[Hacking prerequisites]]: "Install dev environment", etc. Don't miss creating the Postgres database, docker groups, etc. |
14 | 1 | Tom Clegg | |
15 | 32 | Tom Clegg | h2. Environment |
16 | |||
17 | Your locale must use utf-8. Set environment variable LANG=C.UTF-8 if necessary to ensure the "locale" command reports UTF-8. |
||
18 | |||
19 | 29 | Tom Clegg | h2. If you're Jenkins |
20 | |||
21 | Run all tests from a clean slate (slow, but more immune to leaks) |
||
22 | |||
23 | <pre> |
||
24 | ~/arvados/build/run-tests.sh WORKSPACE=~/arvados |
||
25 | 1 | Tom Clegg | </pre> |
26 | |||
27 | 29 | Tom Clegg | h2. If you're a developer |
28 | 1 | Tom Clegg | |
29 | 29 | Tom Clegg | Cache everything needed to run test suites: |
30 | 1 | Tom Clegg | |
31 | 29 | Tom Clegg | <pre> |
32 | mkdir ~/.cache/arvados-build |
||
33 | ~/arvados/build/run-tests.sh WORKSPACE=~/arvados --temp ~/.cache/arvados-build --only install |
||
34 | </pre> |
||
35 | 1 | Tom Clegg | |
36 | 29 | Tom Clegg | Start interactive mode: |
37 | |||
38 | 1 | Tom Clegg | <pre> |
39 | 29 | Tom Clegg | $ ~/arvados/build/run-tests.sh WORKSPACE=~/arvados --temp ~/.cache/arvados-build --interactive |
40 | 1 | Tom Clegg | </pre> |
41 | |||
42 | 34 | Ward Vandewege | Start interactive mode and enabled debug output: |
43 | |||
44 | <pre> |
||
45 | $ ~/arvados/build/run-tests.sh WORKSPACE=~/arvados ARVADOS_DEBUG=1 --temp ~/.cache/arvados-build --interactive |
||
46 | </pre> |
||
47 | |||
48 | |||
49 | 29 | Tom Clegg | When prompted, choose a test suite to run: |
50 | 1 | Tom Clegg | |
51 | 29 | Tom Clegg | <pre> |
52 | == Interactive commands: |
||
53 | test TARGET |
||
54 | test TARGET:py3 (test with python3) |
||
55 | test TARGET -check.vv (pass arguments to test) |
||
56 | install TARGET |
||
57 | install env (go/python libs) |
||
58 | install deps (go/python libs + arvados components needed for integration tests) |
||
59 | reset (...services used by integration tests) |
||
60 | exit |
||
61 | == Test targets: |
||
62 | cmd/arvados-client lib/dispatchcloud/container sdk/go/auth sdk/pam:py3 services/fuse tools/crunchstat-summary |
||
63 | cmd/arvados-server lib/dispatchcloud/scheduler sdk/go/blockdigest sdk/python services/fuse:py3 tools/crunchstat-summary:py3 |
||
64 | lib/cli lib/dispatchcloud/ssh_executor sdk/go/crunchrunner sdk/python:py3 services/health tools/keep-block-check |
||
65 | lib/cloud lib/dispatchcloud/worker sdk/go/dispatch services/arv-git-httpd services/keep-balance tools/keep-exercise |
||
66 | lib/cloud/azure lib/service sdk/go/health services/crunch-dispatch-local services/keepproxy tools/keep-rsync |
||
67 | lib/cloud/ec2 sdk/cwl sdk/go/httpserver services/crunch-dispatch-slurm services/keepstore tools/sync-groups |
||
68 | lib/cmd sdk/cwl:py3 sdk/go/keepclient services/crunch-run services/keep-web |
||
69 | lib/controller sdk/go/arvados sdk/go/manifest services/crunchstat services/nodemanager |
||
70 | lib/crunchstat sdk/go/arvadosclient sdk/go/stats services/dockercleaner services/nodemanager:py3 |
||
71 | lib/dispatchcloud sdk/go/asyncbuf sdk/pam services/dockercleaner:py3 services/ws |
||
72 | What next? |
||
73 | </pre> |
||
74 | 1 | Tom Clegg | |
75 | 29 | Tom Clegg | Example: testing lib/dispatchcloud/container, showing verbose/debug logs: |
76 | 1 | Tom Clegg | |
77 | <pre> |
||
78 | 29 | Tom Clegg | What next? test lib/dispatchcloud/container/ -check.vv |
79 | ======= test lib/dispatchcloud/container |
||
80 | START: queue_test.go:99: IntegrationSuite.TestCancelIfNoInstanceType |
||
81 | WARN[0000] cancel container with no suitable instance type ContainerUUID=zzzzz-dz642-queuedcontainer error="no suitable instance type" |
||
82 | WARN[0000] cancel container with no suitable instance type ContainerUUID=zzzzz-dz642-queuedcontainer error="no suitable instance type" |
||
83 | START: queue_test.go:37: IntegrationSuite.TearDownTest |
||
84 | PASS: queue_test.go:37: IntegrationSuite.TearDownTest 0.846s |
||
85 | |||
86 | PASS: queue_test.go:99: IntegrationSuite.TestCancelIfNoInstanceType 0.223s |
||
87 | |||
88 | START: queue_test.go:42: IntegrationSuite.TestGetLockUnlockCancel |
||
89 | INFO[0001] adding container to queue ContainerUUID=zzzzz-dz642-queuedcontainer InstanceType=testType Priority=1 State=Queued |
||
90 | START: queue_test.go:37: IntegrationSuite.TearDownTest |
||
91 | PASS: queue_test.go:37: IntegrationSuite.TearDownTest 0.901s |
||
92 | |||
93 | PASS: queue_test.go:42: IntegrationSuite.TestGetLockUnlockCancel 0.177s |
||
94 | |||
95 | OK: 2 passed |
||
96 | PASS |
||
97 | 33 | Ward Vandewege | ok git.arvados.org/arvados.git/lib/dispatchcloud/container 2.150s |
98 | 29 | Tom Clegg | ======= test lib/dispatchcloud/container -- 3s |
99 | Pass: lib/dispatchcloud/container tests (3s) |
||
100 | All test suites passed. |
||
101 | 1 | Tom Clegg | </pre> |
102 | |||
103 | 29 | Tom Clegg | h3. Running individual test cases |
104 | 1 | Tom Clegg | |
105 | 62 | Brett Smith | h4. Golang |
106 | |||
107 | 29 | Tom Clegg | Most Go packages use gocheck. Use gocheck command line args like -check.f. |
108 | |||
109 | 1 | Tom Clegg | <pre> |
110 | 29 | Tom Clegg | What next? test lib/dispatchcloud/container -check.vv -check.f=LockUnlock |
111 | ======= test lib/dispatchcloud/container |
||
112 | START: queue_test.go:42: IntegrationSuite.TestGetLockUnlockCancel |
||
113 | INFO[0000] adding container to queue ContainerUUID=zzzzz-dz642-queuedcontainer InstanceType=testType Priority=1 State=Queued |
||
114 | START: queue_test.go:37: IntegrationSuite.TearDownTest |
||
115 | PASS: queue_test.go:37: IntegrationSuite.TearDownTest 0.812s |
||
116 | |||
117 | PASS: queue_test.go:42: IntegrationSuite.TestGetLockUnlockCancel 0.184s |
||
118 | |||
119 | OK: 1 passed |
||
120 | PASS |
||
121 | 33 | Ward Vandewege | ok git.arvados.org/arvados.git/lib/dispatchcloud/container 1.000s |
122 | 29 | Tom Clegg | ======= test lib/dispatchcloud/container -- 2s |
123 | 1 | Tom Clegg | </pre> |
124 | |||
125 | 62 | Brett Smith | h4. Python |
126 | 1 | Tom Clegg | |
127 | 63 | Brett Smith | If what you really want to do is focus on failing or newly-added tests, consider passing the appropriate switches to do that: |
128 | |||
129 | 1 | Tom Clegg | <pre> |
130 | 63 | Brett Smith | -x, --exitfirst Exit instantly on first error or failed test |
131 | --lf, --last-failed Rerun only the tests that failed at the last run (or |
||
132 | all if none failed) |
||
133 | --ff, --failed-first Run all tests, but run the last failures first. This |
||
134 | may re-order tests and thus lead to repeated fixture |
||
135 | setup/teardown. |
||
136 | --nf, --new-first Run tests from new files first, then the rest of the |
||
137 | tests sorted by file mtime |
||
138 | </pre> |
||
139 | |||
140 | If you want to manually select tests: |
||
141 | |||
142 | <pre> |
||
143 | FILENAME Run tests from FILENAME, relative to the source root |
||
144 | FILENAME::CLASSNAME Run tests from CLASSNAME |
||
145 | FILENAME::FUNCNAME, FILENAME::CLASSNAME::FUNCNAME |
||
146 | Run only the named test function |
||
147 | -k EXPRESSION Only run tests which match the given substring |
||
148 | expression. An expression is a Python evaluable |
||
149 | expression where all names are substring-matched |
||
150 | against test names and their parent classes. |
||
151 | Example: -k 'test_method or test_other' matches all |
||
152 | test functions and classes whose name contains |
||
153 | 'test_method' or 'test_other', while -k 'not |
||
154 | test_method' matches those that don't contain |
||
155 | 'test_method' in their names. -k 'not test_method |
||
156 | and not test_other' will eliminate the matches. |
||
157 | Additionally keywords are matched to classes and |
||
158 | functions containing extra names in their |
||
159 | 'extra_keyword_matches' set, as well as functions |
||
160 | which have names assigned directly to them. The |
||
161 | matching is case-insensitive. |
||
162 | -m MARKEXPR Only run tests matching given mark expression. For |
||
163 | example: -m 'mark1 and not mark2'. |
||
164 | </pre> |
||
165 | |||
166 | For even more options, refer to the "pytest command line reference":https://docs.pytest.org/en/stable/reference/reference.html#command-line-flags. |
||
167 | |||
168 | Example: |
||
169 | |||
170 | <pre> |
||
171 | What next? test sdk/python:py3 --disable-warnings --tb=no --no-showlocals tests/test_keep_client.py::KeepDiskCacheTestCase |
||
172 | 1 | Tom Clegg | ======= test sdk/python |
173 | 63 | Brett Smith | […pip output…] |
174 | ========================================================== test session starts ========================================================== |
||
175 | platform linux -- Python 3.8.19, pytest-8.2.0, pluggy-1.5.0 |
||
176 | rootdir: /home/brett/Curii/arvados/sdk/python |
||
177 | configfile: pytest.ini |
||
178 | collected 9 items |
||
179 | 1 | Tom Clegg | |
180 | 63 | Brett Smith | tests/test_keep_client.py F........ [100%] |
181 | 1 | Tom Clegg | |
182 | 63 | Brett Smith | ======================================================== short test summary info ======================================================== |
183 | FAILED tests/test_keep_client.py::KeepDiskCacheTestCase::test_disk_cache_cap - AssertionError: True is not false |
||
184 | ====================================================== 1 failed, 8 passed in 0.16s ====================================================== |
||
185 | ======= sdk/python tests -- FAILED |
||
186 | ======= test sdk/python -- 2s |
||
187 | Failures (1): |
||
188 | Fail: sdk/python tests (2s) |
||
189 | What next? test sdk/python:py3 --disable-warnings --tb=no --no-showlocals --lf |
||
190 | ======= test sdk/python |
||
191 | […pip output…] |
||
192 | ========================================================== test session starts ========================================================== |
||
193 | platform linux -- Python 3.8.19, pytest-8.2.0, pluggy-1.5.0 |
||
194 | rootdir: /home/brett/Curii/arvados/sdk/python |
||
195 | configfile: pytest.ini |
||
196 | testpaths: tests |
||
197 | collected 964 items / 963 deselected / 1 selected |
||
198 | run-last-failure: rerun previous 1 failure |
||
199 | |||
200 | tests/test_keep_client.py F [100%] |
||
201 | |||
202 | ======================================================== short test summary info ======================================================== |
||
203 | FAILED tests/test_keep_client.py::KeepDiskCacheTestCase::test_disk_cache_cap - AssertionError: True is not false |
||
204 | ============================================= 1 failed, 963 deselected, 1 warning in 0.43s ============================================== |
||
205 | ======= sdk/python tests -- FAILED |
||
206 | ======= test sdk/python -- 2s |
||
207 | Failures (1): |
||
208 | Fail: sdk/python tests (2s) |
||
209 | 20 | Tom Clegg | </pre> |
210 | 29 | Tom Clegg | |
211 | 20 | Tom Clegg | h4. RailsAPI |
212 | 29 | Tom Clegg | |
213 | 20 | Tom Clegg | <pre> |
214 | 29 | Tom Clegg | What next? test services/api TESTOPTS=--name=/.*signed.locators.*/ |
215 | [...] |
||
216 | # Running: |
||
217 | |||
218 | .... |
||
219 | |||
220 | 20 | Tom Clegg | Finished in 1.080084s, 3.7034 runs/s, 461.0751 assertions/s. |
221 | 29 | Tom Clegg | </pre> |
222 | 3 | Tom Clegg | |
223 | 29 | Tom Clegg | h3. Restarting services for integration tests |
224 | 3 | Tom Clegg | |
225 | 29 | Tom Clegg | If you have changed services/api code, and you want to check whether it breaks the lib/dispatchcloud/container integration tests: |
226 | 3 | Tom Clegg | |
227 | 29 | Tom Clegg | <pre> |
228 | What next? reset # teardown the integration-testing environment |
||
229 | 35 | Tom Clegg | What next? install services/api # (only needed if you've updated dependencies) |
230 | What next? test lib/dispatchcloud/container # bring up the integration-testing environment and run tests |
||
231 | What next? test lib/dispatchcloud/container # leave the integration-testing environment up and run tests |
||
232 | </pre> |
||
233 | |||
234 | h3. Updating cache after pulling master |
||
235 | |||
236 | Always quit interactive mode and restart after modifying run-tests.sh (via git-pull, git-checkout, editing, etc). |
||
237 | |||
238 | When you start, run "install all" to get the latest gem/python dependencies, install updated versions of Arvados services used by integration tests, etc. |
||
239 | |||
240 | Then you can resume your cycle of "test lib/controller", etc. |
||
241 | |||
242 | h3. Controlling test order (Rails) |
||
243 | |||
244 | 29 | Tom Clegg | Rails tests start off with a line like this |
245 | |||
246 | 24 | Radhika Chippada | <pre> |
247 | Run options: -v -d --seed 57089 |
||
248 | </pre> |
||
249 | 26 | Radhika Chippada | |
250 | 24 | Radhika Chippada | The seed value determines the order tests are run. To reproduce reproduce an order-dependent test failure, specify the same seed as a previous failed run: |
251 | |||
252 | <pre> |
||
253 | What next? test services/api TESTOPTS="-v -d --seed 57089" |
||
254 | </pre> |
||
255 | |||
256 | 26 | Radhika Chippada | |
257 | 24 | Radhika Chippada | h3. Other options |
258 | |||
259 | For more usage info, try: |
||
260 | |||
261 | <pre> |
||
262 | ~/arvados/build/run-tests.sh --help |
||
263 | </pre> |
||
264 | 26 | Radhika Chippada | |
265 | 24 | Radhika Chippada | h2. Running workbench diagnostics tests |
266 | |||
267 | 25 | Radhika Chippada | You can run workbench diagnostics tests against any production server. |
268 | 24 | Radhika Chippada | |
269 | Update your workbench application.yml to add a "diagnostics" section with the login token and pipeline details. The below example configuration is to run the "qr1hi-p5p6p-ftcb0o61u4yd2zr" pipeline in "qr1hi" environment. |
||
270 | 5 | Tom Clegg | |
271 | <pre> |
||
272 | diagnostics: |
||
273 | secret_token: useanicelongrandomlygeneratedsecrettokenstring |
||
274 | arvados_workbench_url: https://workbench.qr1hi.arvadosapi.com |
||
275 | user_tokens: |
||
276 | 37 | Ward Vandewege | active: yourcurrenttokenintheenvironmenttowhichyouarepointing |
277 | pipelines_to_test: |
||
278 | pipeline_1: |
||
279 | 54 | Ward Vandewege | template_uuid: qr1hi-p5p6p-ftcb0o61u4yd2zr |
280 | 53 | Ward Vandewege | input_paths: [] |
281 | max_wait_seconds: 300 |
||
282 | </pre> |
||
283 | 58 | Stephen Smith | |
284 | 1 | Tom Clegg | You can now run the "qr1hi" diagnostics tests using the following command: |
285 | 58 | Stephen Smith | <pre> |
286 | cd $ARVADOS_HOME |
||
287 | 59 | Stephen Smith | RAILS_ENV=diagnostics bundle exec rake TEST=test/diagnostics/pipeline_test.rb |
288 | 58 | Stephen Smith | </pre> |
289 | 1 | Tom Clegg | |
290 | 59 | Stephen Smith | h2. Running workbench2 tests |
291 | 58 | Stephen Smith | |
292 | React uses a lot of filesystem watchers (via inotify). The default number of watched files is relatively low at 8192. Increase that with: |
||
293 | |||
294 | echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p |
||
295 | |||
296 | 1 | Tom Clegg | h3. Docker |
297 | 49 | Ward Vandewege | |
298 | 61 | Stephen Smith | The integration tests can be run on non-debian based systems using docker. The workbench2 repo includes a Dockerfile that preinstalls the necessary dependencies to run cypress. |
299 | 46 | Ward Vandewege | |
300 | 1 | Tom Clegg | Build the docker image using this command from within the @arvados@ repository |
301 | 60 | Stephen Smith | |
302 | <pre> |
||
303 | docker build . -f services/workbench2/docker/Dockerfile -t workbench2-build |
||
304 | </pre> |
||
305 | |||
306 | Then, start the container using the following arguments: |
||
307 | 58 | Stephen Smith | |
308 | 1 | Tom Clegg | <pre> |
309 | 58 | Stephen Smith | xhost +local:root |
310 | ARVADOS_DIR=/path/to/arvados |
||
311 | 45 | Ward Vandewege | docker run -ti -v$ARVADOS_DIR:/usr/src/arvados -w /usr/src/arvados --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" workbench2-build:latest bash |
312 | </pre> |
||
313 | |||
314 | h4. Docker Troubleshooting |
||
315 | |||
316 | h5. No version of Cypress is installed |
||
317 | |||
318 | Solution: Manually install the required cypress version by running @./node_modules/.bin/cypress install@ inside the container |
||
319 | |||
320 | h3. Debian Host System |
||
321 | 37 | Ward Vandewege | |
322 | These instructions assume a Debian 10 (buster) host system. |
||
323 | 39 | Ward Vandewege | |
324 | 40 | Ward Vandewege | Install the Arvados test dependencies: |
325 | 37 | Ward Vandewege | |
326 | <pre> |
||
327 | 52 | Ward Vandewege | echo "deb http://deb.debian.org/debian buster-backports main" > /etc/apt/sources.list.d/backports.list |
328 | 51 | Ward Vandewege | apt-get update |
329 | apt-get install -y --no-install-recommends golang -t buster-backports |
||
330 | apt-get install -y --no-install-recommends build-essential ca-certificates git libpam0g-dev |
||
331 | </pre> |
||
332 | |||
333 | 55 | Ward Vandewege | Install a few more dependencies for workbench2: |
334 | 51 | Ward Vandewege | |
335 | <pre> |
||
336 | apt-get update |
||
337 | 56 | Ward Vandewege | apt-get install -y --no-install-recommends gnupg2 sudo curl |
338 | 1 | Tom Clegg | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - |
339 | 38 | Ward Vandewege | echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list |
340 | 1 | Tom Clegg | apt-get update |
341 | apt-get install -y --no-install-recommends yarn libgbm-dev |
||
342 | 58 | Stephen Smith | # we need the correct version of node to install cypress |
343 | 37 | Ward Vandewege | # use arvados-server install to get it (and all other dependencies) |
344 | 58 | Stephen Smith | # All this will then not need to be repeated by ./tools/run-integration-tests.sh |
345 | # so we are not doing double work. |
||
346 | cd /usr/src/arvados |
||
347 | 1 | Tom Clegg | go mod download |
348 | cd cmd/arvados-server |
||
349 | 58 | Stephen Smith | go install |
350 | ~/go/bin/arvados-server install -type test |
||
351 | cd <your-wb2-directory> |
||
352 | yarn run cypress install |
||
353 | </pre> |
||
354 | |||
355 | Make sure you have both the arvados and arvados-workbench2 source trees available, and then use the following commands (adjust path for the arvados source tree, if necessary) from your workbench2 source tree. |
||
356 | 48 | Ward Vandewege | |
357 | 37 | Ward Vandewege | h3. Running Tests |
358 | 1 | Tom Clegg | |
359 | Run the unit tests with: |
||
360 | <pre> |
||
361 | make unit-tests |
||
362 | # or |
||
363 | yarn test |
||
364 | </pre> |
||
365 | |||
366 | Run the cypress integration tests with: |
||
367 | |||
368 | <pre> |
||
369 | ./tools/run-integration-tests.sh -i -a /usr/src/arvados |
||
370 | </pre> |