angular-cli: Can't run 'ng test' on all apps in a project and provide overrides
Versions
Angular CLI: 6.0.0
Node: 8.9.4
OS: darwin x64
Angular: 6.0.0
... animations, cli, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, platform-server, router
Package Version
------------------------------------------------------------
@angular-devkit/architect 0.6.0
@angular-devkit/build-angular 0.6.0
@angular-devkit/build-optimizer 0.6.0
@angular-devkit/core 0.6.0
@angular-devkit/schematics 0.6.0
@angular/cdk 6.0.1
@angular/material 6.0.1
@angular/material-moment-adapter 6.0.1
@ngtools/webpack 6.0.0
@schematics/angular 0.6.0
@schematics/update 0.6.0
rxjs 6.1.0
typescript 2.7.2
webpack 4.6.0
Repro steps
- Have multiple apps/projects
- Run
ng test --watch=false
or anything that would provide an override
Observed behavior
ng test
works as long as I don’t provide overrides.
Before @angular/cli@6.0.0
, running ng test --watch=false
would work. Now you get the following error:
$ ng test --browsers=ChromeHeadless --watch=false --progress=false --sourcemaps=false
Error: Architect commands with multiple targets cannot specify overrides.'test' would be run on the following projects: app1,app2,app3
at TestCommand.validate (/Users/user/code/angular_app/node_modules/@angular/cli/models/architect-command.js:91:23)
at /Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:274:39
at Generator.next (<anonymous>)
at /Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:7:71
at new Promise (<anonymous>)
at __awaiter (/Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:3:12)
at validateAndRunCommand (/Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:273:12)
at Object.<anonymous> (/Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:100:26)
at Generator.next (<anonymous>)
at fulfilled (/Users/user/code/angular_app/node_modules/@angular/cli/models/command-runner.js:4:58)
Desired behavior
I should be able to provide overrides on ng test
regardless of the number of projects I’m running it on. This worked prior to @angular/cli@6.0.0
.
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Reactions: 22
- Comments: 22 (2 by maintainers)
@Tomek6789
We also wanted to execute all test of all our projects at once in one browser. Starting and stopping the browser for each library was incredibly time-consuming.
Our solution was to create a dummy project inside the
angular.json
. This will execute ALL tests in one single browser. Before, our tests ran around 20 minutes with 30 libraries because the browser took so long to start and stop. Now, our tests run around 1,5 minutes for everything.You can see what we did in my commit here: https://github.com/joostme/ng-test-all/commit/6e4a00a1040a959b98dff28643c7f8c380265f86
Normally “me too” comments aren’t real helpful, I’ll try for an exception:
I’m seeing this same problem using the beta of @angular/cli 7.0.0, so it hasn’t been accidentally fixed:
The problem is exactly as described - I have a pretty spare multi-project workspace, most of the projects haven’t been updated much after they were generated from the cli. And,
ng test --watch=false --browsers=ChromeHeadless
runs in single-run mode and uses ChromeHeadless for the first project, and uses watch mode and Chrome for all subsequent projects. So this is a semi-blocker for CI builds.Workarounds appear to be:
Couldn’t
defaultProject
fromangular.json
be used to select a single project if none is specified?(Like WebStorm 2018.2 EAP still fails to run tests, due to the above error, where as the current 2018.1.3 throws “Error: The ‘@angular-devkit/build-angular/plugins/karma’ karma plugin is meant to be used from within Angular CLI and will not work correctly outside of it.” due to #10703.)
@Nxt3 I’m not sure if this is what you’re asking, but for me, with 3 projects in
angular.json
, runningng test
wil run the tests for all 3 of them. However, not simultaneously but rather sequentially: the next starts after I terminate one by hitting Ctrl+C, due toautoWatch: true
in mykarma.conf.js
.(But trying something like
ng test --watch=false
will throw the error you mentioned.)Why each project in angular.json is opening browser for running tests? Why we can not run all tests in ONE browser?
This is important whan you want to reduce test time execution.
@joostme This is a great workaround for now, thanks! Hopefully Angular CLI fixes this issue soon though so we won’t need to do all this to make it work, but I appreciate you sharing this, was a huge lifesaver for us.
On a new project that was using the versions below:
I ran these commands:
The
--watch=false
flag was passed correctly to both tests and they both finished:I’m pretty sure this was still broken in earlier 7.x versions, but it seems to be fixed in that one.
Any progress on this? Running tests on all projects seems to be a nice feature.
ng lint
also works this way pretty flawless.ng test [project_name] --browsers=ChromeHeadless --watch=false --progress=false --sourcemaps=false
This should be documented and isn’t.
@clydin have you tested that with latest versions of angular/cli? because i have a multiproject workspace and for me it seems like in this case command line arguments are not properly propagated thorugh cli.
ng test [project_name] --browsers=ChromeHeadless --watch=false --progress=false --sourcemaps=false
This line isn’t working at all for me, although it would indeed be how i expected it to work. In my case the tests of the given project ([project_name]) are properly executed but all the additional parameters are ignored and the defaults are used instead.
Thanks for letting me know if it works for someone in a multiproject workspace.