我想与数据库中的已知状态下运行的集成和终端到终端的测试每次运行,让测试独立的和可重复的。 这样做的一个简单的方法是使用泊坞窗,撰写创建,加载从每次转储文件的方案和数据的数据库容器。 然而,这是过于缓慢恢复数据库的每个测试。
一个更好的办法似乎是在一个码头工人的容器或体积一旦恢复数据库,然后复制(安装?)容器/卷数据库文件夹复制到该测试将使用数据库容器,并有每个测试重新拷贝/安装容器/体积,使得它是新鲜的。
但是,我不知道什么是最好的方式与码头工人,组合为做到这一点。 任何人都可以提供一个最小的例子或解释如何做到这一点?
您可以使用它的底层数据存储在主机目录启动数据库。 如果你这样做,那么你就可以创建目录的tar文件,并重新解压它为每个测试运行。
mkdir mysql
docker run -d -p 3306:3306 -v ./mysql:/var/lib/mysql --name mysql mysql
mysql -h 127.0.0.1 < dump.sql
docker stop mysql
docker rm mysql
tar czf mysql.tar.gz mysql
rm -rf mysql
tar xzf mysql.tar.gz
docker run -d -p 3306:3306 -v ./mysql:/var/lib/mysql --name mysql mysql
MYSQL_HOST=127.0.0.1 ./integration_test
docker stop mysql
docker rm mysql
你必须分发数据分开转储(如果以其他方式使用AWS,一个S3桶是它的一个好地方),但因为它是“正义”的测试数据,你总是可以从数据库转储重建,这不是特别珍贵,你不需要跟踪其版本历史记录或试图保持它在源代码控制。
文章来源: How to use docker-compose to restore fresh databases quickly for integration tests?