protected function setUp() {
parent::setUp();
// Файл с дампом базы в tmp-директории
$dumpFile = tempnam('path/to/project/local/test-tmp', 'autotests_dump_');
// В начало файла с дампом пишем команды для пересоздания тестовой базы
$sql = "DROP DATABASE IF EXISTS `autotests_dbname`;\n"
. "CREATE DATABASE `autotests_dbname` DEFAULT CHARACTER SET = utf8;\n"
. "USE `autotests_dbname`;\n";
$this->exec('echo ' . escapeshellarg($sql) . ' > ' . escapeshellarg($dumpFile));
// Делаем дамп с основной базы только структура таблиц, триггеры и т.п.
// Это может быть локальная dev база.
$this->exec('mysqldump --no-create-db --no-data --routines local_dev_dbname >> ' . escapeshellarg($dumpFile));
// Добавляем в дамп файл bootstrap.sql c командами
// для наполнения базы минимально необходимыми данными
$this->exec('cat path/to/project/tests/bootstrap.sql >> ' . escapeshellarg($dumpFile));
// Создаём тестовую базу
$this->exec('mysql < ' . escapeshellarg($dumpFile));
}
private function exec($cmd) {
exec($cmd, $out, $err);
if ($err) {
throw new Exception("Command execution failed: {$cmd}");
}
}
return eval("1")
. eval
вообще может лишь вычислять выражения, что-то более сложное делает exec
.def merge(left, right):
if not left or not right:
return left or right
result = []
i, j = 0, 0
while (len(result) < len(left) + len(right)):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
if i == len(left) or j == len(right):
result.extend(left[i:] or right[j:])
break
return result
def mergesort(list):
if len(list) < 2:
return list
middle = len(list) // 2
left = mergesort(list[:middle])
right = mergesort(list[middle:])
return merge(left, right)
if __name__ == "__main__":
print(mergesort([3, 4, 5, 1, 2, 8, 3, 7, 6]))