---
title: "Smoke Testing"
version: "main"
source: "SmokeTesting/Index.rst"
rendered: "2026-09-24T07:51:28+00:00"
---

# Smoke Testing {#smoke-testing}

As you do automated deployments, you should check if the website is up and running
before switching it to the live site. This is called a *Smoke Test*. We will give
an example for using the built-in HTTP smoke test.

First, you need to create a virtual host with document root in "\<deploymentDirectory>/releases/next/Web".
While a deployment is running, the new website will be available under this URL and can
be used for testing.

Then, add a test as follows to the deployment configuration:

```php
<?php

$workflow = new \TYPO3\Surf\Domain\Model\SimpleWorkflow();

$smokeTestOptions = [
	'url' => 'http://your-website.com',
	'remote' => true,
	'expectedStatus' => 200,
	'expectedRegexp' => '/somethingYouExpectOnThePage/'
];
$workflow->defineTask('MyCompany\\MyPackage\\SmokeTest', \TYPO3\Surf\Task\Test\HttpTestTask::class, $smokeTestOptions);

$workflow->addTask('MyCompany\\MyPackage\\SmokeTest', 'test', $application);

```

The HTTP test has the following options:

Most important options:

-   url (required): URL which should be loaded
-   remote: if TRUE, the smoke test is triggered through the SSH channel on the remote host
    via command-line CURL. If false, it is triggered from the deploying host.
-   expectedStatus: expected HTTP status code
-   expectedHeaders: HTTP Header Strings which are expected (can be a multiline string,
    each header being on a separate line)
-   expectedRegexp: Regular Expression to test the contents of the HTTP response against

Further options:

-   timeout (only if remote=FALSE): HTTP timeout to use
-   port (only if remote=FALSE): HTTP Port to use
-   method (only if remote=FALSE): HTTP method to use (default GET)
-   username (only if remote=FALSE): HTTP Authentication username
-   password (only if remote=FALSE): HTTP Authentication Password
-   data (only if remote=FALSE): HTTP payload
-   proxy (only if remote=FALSE): HTTP Proxy to use
-   proxyPort  (only if remote=FALSE): HTTP Proxy port to use
-   additionalCurlParameters (only if remote=TRUE): list of parameters which
    is directly passed to CURL. Especially useful to e.g. disable SSL certificate
    check (with --insecure)

## Tests in test stage and caches {#tests-in-test-stage-and-caches}

In the test stage, the caches of the application is not flushed in order not to affect the live page.
A possible solution is to disable caches when running smoke tests in the test stage on "next" release.

### TYPO3 {#typo3}

AdditionalConfiguration.php:

```php
if ($context->isTesting()){
	foreach ($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'] as $cacheName => $cacheConfiguration) {
		$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations'][$cacheName]['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class;
	}
}

```

.htaccess:

```php
# Add Rewrite rule near https://github.com/TYPO3/typo3/blob/main/typo3/sysext/install/Resources/Private/FolderStructureTemplateFiles/root-htaccess#L270
RewriteCond %{HTTP_HOST} ^next\.example\.com$
RewriteRule .? - [E=TYPO3_CONTEXT:Testing]

```

If you are not able to set environment variables via .htaccess, you can use composer autoloading and a PHP file.
Thanks to the team of jweiland.net for this solution.

Root composer.json:

```php
{
	"autoload": {
		"files": ["scripts/typo3context.php"]
	}
}

```

typo3context.php:

```php
<?php
// Set the application context in this file because it is not possible to set environment variables
// via .htaccess e.g. on domainFACTORY/jweiland.net servers
$context = 'Production';

// detect application context by domain
if (array_key_exists('HTTP_HOST', $_SERVER)) {
	if (0 === strpos($_SERVER['HTTP_HOST'], 'next.')) {
		$context = 'Testing';
	}
}
putenv('TYPO3_CONTEXT=' . $context);
```
