162 строки
8.0 KiB
Markdown
162 строки
8.0 KiB
Markdown
# Testing the macOS Cookbook
|
|
|
|
- [Syntax and style](#syntax-and-style)
|
|
- [Unit tests](#unit-tests)
|
|
- [Integration tests](#integration-tests)
|
|
- [Rake Tasks](#rake-tasks)
|
|
|
|
## Requirements
|
|
|
|
- [Chef Workstation](https://www.chef.io/downloads/tools/workstation)
|
|
- [Vagrant](https://www.vagrantup.com/)
|
|
- [Packer](https://www.packer.io/)
|
|
- A supported macOS hypervisor:
|
|
- [Parallels](https://www.parallels.com/pd/general/)
|
|
- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
|
|
- [VMWare Fusion](https://www.vmware.com/products/fusion.html)
|
|
|
|
## Syntax and style
|
|
|
|
- `cookstyle`
|
|
|
|
Syntax testing is pretty straight forward. At the root of the cookbook, run:
|
|
|
|
```shell
|
|
cookstyle
|
|
```
|
|
|
|
## Unit tests
|
|
|
|
For unit tests, we focus on testing the library files, which are written
|
|
in pure Ruby and tested with RSpec. The library files contain most of the core
|
|
business logic for each of the custom resources and are used as either mixins
|
|
for the custom resources or contain classes that act as helpers, except with
|
|
explicit namespacing. Some libary files are heavily unit tested, others are definitely
|
|
missing much-needed unit test coverage. The following command syntax assumes
|
|
you've made the Chef Workstation `rspec` your default by running the appropriate
|
|
`chef shell-init` for your shell. (https://docs.chef.io/workstation/ctl_chef/#chef-shell-init)
|
|
|
|
Clone this repo and in the root of the cookbook, run:
|
|
|
|
```shell
|
|
rspec spec
|
|
```
|
|
|
|
To run the unit tests in a specific file:
|
|
|
|
```shell
|
|
rspec spec/unit/libraries/xcode_spec.rb
|
|
```
|
|
|
|
## Integration tests
|
|
|
|
For integration tests, we test custom resources using a test cookbook, found in
|
|
[`test/cookbooks/macos_test`](https://github.com/Microsoft/macos-cookbook/tree/master/test/cookbooks/macos_test).
|
|
In general, each of the custom resources is used in a corresponding test recipe,
|
|
which is then added to a corresponding suite's runlist. For example, the `xcode`
|
|
resource is used in the `xcode.rb` recipe, which is called in the `xcode` suite.
|
|
For the specific suite, there are corresponding integration tests as specified
|
|
in the suite. Every suite is tested against all three platform version.
|
|
|
|
### Building a macOS Vagrant Box
|
|
|
|
Due to Apple's Software License Agreement, you'll need to build your own boxes.
|
|
There's a number of different resources on GitHub that provide some really great
|
|
guides, but we're partial to [osx-vm-templates](https://github.com/timsutton/osx-vm-templates).
|
|
|
|
This procedure is a bit of a pain to really nail down. We've been working on
|
|
refining and automating it as much as possible, but regular changes to the macOS
|
|
operating system by Apple (e.g. signing restrictions introduced in 10.12.3) have
|
|
made this challenging.
|
|
|
|
Read the [osx-vm-templates README](https://github.com/timsutton/osx-vm-templates/blob/master/README.md)
|
|
thouroughly to get a clear understanding of what needs to be done to turn a "vanilla"
|
|
macOS installer into a shiny new, barely-touched macOS Vagrant base box. The process
|
|
is pretty different depending on which version you're building, so tread lightly.
|
|
|
|
It should be noted that we also maintain a [fork of osx-vm-templates](https://github.com/americanhanko/osx-vm-templates)
|
|
that contains a revised README and better support for building Parallels Desktop
|
|
Vagrant boxes. We're working on getting those changes implemented, but there is
|
|
a few issues that need to be addressed before doing so.
|
|
|
|
### Running the tests
|
|
|
|
Once you have finished building and "adding" your box (with `vagrant box add`),
|
|
you'll need to modify the `.kitchen.yml`. The only modifications you should
|
|
need to make are replacing our box names with yours. For example, you would
|
|
replace `microsoft/macos-monterey` with `my_macos_box`. To double check the
|
|
available boxes and their names, execute `vagrant box list`. For example:
|
|
|
|
```shell
|
|
$ vagrant box list
|
|
microsoft/macos-big-sur (parallels, 11.6.1)
|
|
microsoft/macos-catalina (parallels, 10.15.7)
|
|
microsoft/macos-high-sierra (parallels, 10.13.6)
|
|
microsoft/macos-mojave (parallels, 10.14.6)
|
|
microsoft/macos-monterey (parallels, 12.2)
|
|
```
|
|
|
|
Next, make sure you're in the macOS cookbook root and run `kitchen list` to view
|
|
the available instances. It should look something like this:
|
|
|
|
```shell
|
|
$ kitchen list
|
|
Instance Driver Provisioner Verifier Transport Last Action Last Error
|
|
default-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
default-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
default-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
default-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
software-updates-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
software-updates-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
software-updates-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
software-updates-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
spotlight-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
spotlight-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
spotlight-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
spotlight-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-apple-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-apple-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-apple-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-apple-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-url-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-url-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-url-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
xcode-from-url-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
command-line-tools-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
command-line-tools-catalina-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
command-line-tools-big-sur-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
command-line-tools-monterey-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
certificate-mojave-chef17 Vagrant ChefInfra Inspec Ssh <Not Created> <None>
|
|
```
|
|
|
|
The `kitchen list` command serves as a nearly-perfect way to validate the
|
|
`.kitchen.yml` syntax. For more info, check out `kitchen help` for commands and
|
|
run `kitchen help COMMAND` for help on a specific subcommand. When you're ready,
|
|
run `kitchen test`.
|
|
|
|
```shell
|
|
kitchen test
|
|
```
|
|
|
|
`kitchen` supports using regular expressions to only run a specific instance.
|
|
For example:
|
|
|
|
```shell
|
|
kitchen test xcode # test the xcode suite on all versions
|
|
kitchen test default.*101[23] # only test default suites on 10.12 and 10.13
|
|
```
|
|
|
|
macOS takes a little while to boot and the suites themselves (especially Xcode)
|
|
can take a while to run - some of our builds end up being 30-40 minutes per operating
|
|
system. If you've got the hardware, don't be afraid to run
|
|
`kitchen test --concurrency n` to save a little time (where `n` is the number of concurrent
|
|
instances you want to boot up).
|
|
|
|
## Rake Tasks
|
|
|
|
Included are some convenient rake tasks for running particular batteries of tests. Just run `rake` to see a list of tasks available.
|
|
|
|
### Continuous testing with guard
|
|
|
|
We've included a Guardfile custom-tailored to run the appropriate unit tests whenever a file is modified. To get started, simply `bundle install && rake test:guard` and watch the appropriate tests run automatically as you edit source files!
|