Skip to content

Environment plugin#4

Open
whowareu wants to merge 2 commits into
ozontech:mainfrom
whowareu:environment-plugin
Open

Environment plugin#4
whowareu wants to merge 2 commits into
ozontech:mainfrom
whowareu:environment-plugin

Conversation

@whowareu

@whowareu whowareu commented Jun 9, 2026

Copy link
Copy Markdown

Привет! При написании тестов на базе allure-go часто взаимодействую с стендозависимыми параметрами при прогоне джоб\локального запуска и думаю плагин с подобным функционалом смотрелся бы хорошо в рамках стандартной библиотеки плагинов

type T struct {
    *testo.T
    *environment.PluginEnvironment
}

type Suite struct{ testo.Suite[T] }

func Test(t *testing.T) {
    options := []testoplugin.Option{
        environment.WithEnvironments(".env", "config.env"),
    }

    testo.RunSuite(t, new(Suite), options...)
}

func (Suite) TestEnvVars(t T) {
    // This test can use env vars from .env files
    os.Getenv("MY_VAR") // Returns value from loaded file
}

How it Works

It loads environment variables from .env files before running any tests. The plugin:

  1. Reads .env files in BeforeAll hook
  2. Sets env vars for the test suite
  3. Supports multiple files - later files overwrite earlier ones
  4. Defaults to .env when no files specified
  5. Handles comments (#) and empty lines
  6. Strips quotes from values ("value" → value)
// Default behavior - loads .env from current directory
environment.WithEnvironments()

// Multiple files - base.env values can be overridden by override.env
environment.WithEnvironments("base.env", "override.env")

// Custom defaults - modify this package variable to load multiple files by default
var DefaultEnviroments = []string{".env", "config.env"}
// ✅ Using environment plugin - automatic and consistent
func Test(t *testing.T) {
    options := []testoplugin.Option{
        environment.WithEnvironments(".env"),
    }
    testo.RunSuite(t, new(Suite), options...)
    // Env vars are automatically set and cleaned up
}

.env File Format

# This is a comment
DB_HOST=localhost
DB_PORT=5432
API_KEY="super-secret-token"
DEBUG_MODE='true'

@metafates

Copy link
Copy Markdown
Member

Привет! Спасибо за работу, классная идея 🙇

Есть несколько мыслей на этот счет.

Проблема с T.Setenv в том, что он не может вызываться в параллельных тестах и даже вызовет панику. Дело в том, что переменные окружения выставляются для всего процесса, поэтому по сути их нужно выставлять всего лишь раз. И в таком случае достаточно просто вызова какой нибудь функции:

func init() {
	loadEnv(".env", ".env.prod", ...)
}

Или даже в TestMain:

func TestMain(m *testing.M) {
  loadEnv(".env")
	m.Run()
}

То есть по удобству использования будто бы то же самое, что и подключение плагина, однако гораздо прямолинейнее.

Что думаешь на этот счет? Может, есть какой-то сценарий, о котором я не подумал?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants