JavaScript and AngularJS testing - Karma, Jasmine, karma-jasmine, etc - angularjs

I'm preparing some curriculum for students at a bootcamp, and this is my first exposure to testing in general, let alone testing in Angular. I've been researching a lot of stuff, but thought I could get some definitive answers from the community:
I'm still a little hazy on how Karma and Jasmine work together. I understand that Karma is a test runner and Jasmine is the framework that includes assertions, describe blocks, etc. But what is the best/preferred way to install these to start including testing in an Angular app? I've done npm install --save-dev karma, run karma init and set all the settings, and downloaded Jasmine from their releases page, but I'm not exactly sure how to integrate these into a new or existing Angular application. The Jasmine Standalone seems to have its own organization that requires you to move all your source files to their src folder, but that seems ridiculous unless you're just testing vanilla JavaScript (which I'm guessing is what the Jasmine standalone version is for?)
I also saw in the Angular docs on testing a reference to karma-jasmine, which I'm not 100% sure how that plays in with karma and jasmine as separate entities.
Any guidance or help for a testing beginner would be greatly appreciated. I've spent hours researching and am still a bit confused on all of it. Sorry if these questions are dumb, I'm really new to the whole concept.
Thanks in advance for your help!

Related

AngularJS Upgrade to Angular Hybrid with Grunt/Bower

I have an older project that we want to add some more functionality to. It's a fairly big project so rewriting it is out of the question. I've been reading and following the Angular ngUpgrade guide to make the transition to be able to write Angular 2+ code and run it with my AngularJS application.
However, there are some things that I'm missing and I'm quite confused on what I need to do.
My team created the initial project using Grunt and Bower, looks like through a Yeoman generator. I've been following along in the PhoneCat Upgrade Tutorial and I'm at the part where it says to "Install Angular into the project, along with the SystemJS module loader."
At this point I've looked into SystemJS a bit and what we have with our Bower/Grunt setup but am fairly confused.
So my question is, do I need to change my AngularJS application to use SystemJS before continuing with the Angular Upgrade, or can Grunt and SystemJS work together in some way?

Is it possible to run Karma unit tests against a prebuilt Angular package?

Currently I have an Angular application built on top of NG6-starter. The NG6-Starter uses webpack to bundle the application. It also supports unit testing by default via Karma, but karma uses webpack as well in order to get all the sources injected to it's browser.
Now, my issue is, that I would like to add my application to a classic CI/CD pipeline: Some static analysis, then package build, then unit tests, then etc, and I do not want to break the principle of "Test against the artifact that you are going to deploy" principle. Since karma currently builds the application for itself, it does not really rely on the artifact, that is going to be deployed, even though by the stage karma runs, it is already built.
My question is, if you have any idea/practice/example/experience with this topic?
Okay, so it seems so, that in order to achieve this, the spec files should be built with webpack during build time. For this, the easiest way seemed to be to simple introduce a new chunk entry point to the application.

Step by step guide to run angular js app with Jasmine and Karma

I am looking for a beginner's guide to running angular js app with Jasmine and Karma. Very step by step and thorough guide. I am a beginner in unit testing with JS framework. Can someone please point me to some right resources ?
I tried to follow https://docs.angularjs.org/tutorial for angular-phonecat-master and npm is just giving me a bunch of errors.
I want something very simple. Probably not involving NPM at this point. I am trying to setup on windows.
This is probably the quickest way to get started with AngularJS. The unit tests are written in Jasmine and run with the Karma Test Runner.
https://github.com/angular/angular-seed
The README goes through all the necessary steps to set up a sample AngularJS application that you can use as a starting point for your own application.
Hope this helps.

Test runners for AngularJS - how to run the tests from eclipse IDE and CI server without too much complication?

I am trying to figure out a simple way to run tests on angularjs application.
I am new to the testing world, so it's a little hard to understand all the options and the difference between them.
My goal: to be able to run the tests simply from within my IDE - Eclipse.
And to tests the code on google chrome browser.
I found jasmine to be the obvious choice for writing js unit tests. The problem is choosing a runner both for the jasmine tests and for e2e tests.
Trying to keep it simple, I've come up with the following idea for a setup:
Write the unit tests in jasmine, and the e2e tests in phantomjs and syn.js.
Then configure eclipse to run phantomjs as an external tool, so that the output will go to the console in eclipse.
I also plan to have a CI job in Jenkins, and to my understanding Jenkins can also run phantom, so theoretically this solution will work the same for CI.
Alternatively, there are test running tools like Karma and Protractor. On one hand, they seem to be recommended, but on the other hand they seem to me like overkill in some cases. They require a lot of different tools/services/processes to be running in order to work, and it seems like a pain maintain all that setup if it breaks.
To my understanding: protractor runs on webdriverjs which runs on nodejs, and it requires a selenium server to be running in the background, and on top of all that the selenium opens real browser windows which seems a little pointless as opposed to headless browser testing.
Then there is Karma, that I did not yet fully understand what it's supposed to do. From what I've read it monitors the files in my project and whenever a file is changed it runs the tests. I'm not sure how it runs the tests - is it also using selenium?
And lastly, there are grunt and yeoman, which I did not understand at all what they do and how they interact or fit together with the other tools I've listed.
I would appreciate if someone could clarify what these different tools do, and how they fit together. Also, how would they fit with Jenkins as a CI server?
Also if you could comment on my "simpler setup" - does it make sense? Am I missing something?
Karma is for unit testing your JS, regardless of whether it is using Angular or not. The ins and outs of unit testing with Karma are covered very well here: http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-karma.html. Yes, Karma opens and closes browser windows as needed and specified in the configuration file. If you don't want any browser windows opened, you can use PhantomJS. You can run Karma from within most any IDE that is capable of running an external script, or run it via the command line.
Protractor is for end-to-end (or E2E) testing of your project as a whole. It will open a browser window and click through the pages as though it were a user, entering data where you tell it to and looking for the specified results. Protractor is a bit more complicated than just writing some Jasmine, but the results are worth it. Like Karma, you can run Protractor from within most any IDE that is capable of running external scripts or via the command line.
Yeoman is a process management system that incorporates dependency management via Bower, task automation via Grunt, and project management via Yo. It will run your tests in Karma and Protractor, minify your JS, CSS, and HTML, compile everything into appropriate files (internal JS, external libraries, and CSS) and provide you with a complete package that can be deployed. The beauty of Yeoman is that it is not specific to any one IDE. Everything it does can be done by scripting in your IDE or via the command line.
Now, having said all of this about Yeoman, you do still have to write the tests (it won't magically come up with them for you) and learn to integrate it into your development routine, but it is definitely the way to go for JS development. Eclipse is fine for JS development, but you'll get better performance and ease of use (IMHO) from WebStorm.
As for how these all fit into CI like Jenkins, I believe that both Karma and Protractor output test results in a format that Jenkins can read and display. With the scripting possibilities in Jenkins you can configure it to run the build process each time your source control repository (you are using some sort of source control, aren't you?) changes and show those results on the Jenkins page. My office has a very similar setup and we use it daily. I'm not the guy that has to do the Jenkins configuration, but I do work with Yeoman (and thus Karma and Protractor) via WebStorm on a regular basis and have had very good results.
I would say the clear choice here is Karma and Protractor. While it is true that they rely on a bunch of other stuff, they do so pretty antiseptically: protractor starts up the selenium server and then shuts it off when it's done. Once you have node installed, the other installations are all super simple. I would also install httpster, which will serve up your public director on port 3333.
Frankly, having come from a decade of doing TDD in the Java world, when I first looked at Javascript a few years ago (again), the testing picture was a complete joke. But now, I think the combination of Karma and Protractor is pretty fantastic. Inside IntelliJ, you can run the Karma tests and they are stupid fast and the results are presented in a runner that's as good as anything I've seen in the Java world (Xcode 5 has the best test integration). You can also install the ddescribe plugin in IntelliJ and have a ui for running individual tests or excluding tests.
On the protractor side, I found this post because I am at the point now where I am going to run my karma, protractor and then JUnit tests on a continuous integration server (either Jenkins or TeamCity). I was kind of surprised at the paucity of info on that leg of the trip, but the clear direction I see there is Grunt, because it will run your protractor tests then generate the JUnit-style output Jenkins wants. Grunt is also a pretty impressive addition to the JS world.
I know this sounds like a bunch of opinions, but I think that as happened in the Java world, the Javascript world has now reached that level of maturity where you are just going to have to expect things to drag other things in with them. Frankly, looks like node and npm do a pretty nice job of making that pretty seamless (vs. a decade down the drain on Maven in the Java world).
Updated: Sorry I did not read your question properly.
karma is a test runner, which is best suited for jasmine. For setting up is very very easy. Please download node, and install npm install karma. Follow the angular seed sandbox project it contains all the basic config set up for unit testing and end to end testing (in config folder).all you need is nodejs plugin installed in eclipse
Yeoman can be used for javascript minification, sass compilation e.t.c.
Install node eclipse and you can set all up in eclipse.
http://www.nodeclipse.org/

AngularJS + RequireJS + Bower + Karma + Yeoman + Node

I'm building a app for learning, and I have these major components.
My first question is if these parts are a good foundation for an angularJS app.
I've read in some cases that RequireJS is not a good idea, but not sure why.
My goal is to have a dev environment set up where I have unit and e2e tests, and I want to have this in place before I start coding.
I'm having trouble getting these pieces to work together, and as I push through the issues I thought I'd ask what the latest best practice is to build a non trivial angularJS app.
I have a project that uses AngularJS + RequireJS + Bower + Karma in Github that you can take a look:
http://marcoslin.github.io/angularAMD/
For me, RequireJS has worked very nicely with AngularJS and together it helped tremendously in both application load time and code organisation. I do not use Yeoman yet but Grunt and Bower serve as key foundation for dependency sourcing and building of final project. Karma is a must for unit testing. You should be able see all these components working together in angularAMD Github project.
Your question is a little vague, and answers will be mostly opinions. Anyway, here's mineā€¦
You definitely need node to run all the modern javascript web development tools. (grunt, yeoman, karma, mocha, jshint, uglify, coffee, etc, etc.) Bower is nice to have for updating your client packages. RequireJS is useful for module loading, but not necessary. It should work with AngularJS, but keep in mind that the angular "modules" are completely different from RequireJS "modules". If I were you, I'd work through the Angular tutorial to get a good understanding. Then start your project with yeoman: yo angular.

Resources