Я разрабатывал проект без Docker, и я интегрировал его, и чтобы убедиться, что все в порядке, я запустил свои тесты. Это шокировало меня, почти половина моих тестов не проходит нормально. Большинство из них тестируют подробные API-представления. Я выложу коды ниже. Пожалуйста, дайте знать, если вы можете найти что-то пропущенное или скрытое))
[Это пример проекта]
models.py
class Book(models.Model):
name = models.CharField(max_length=255)
author = models.CharField(max_length=255)
created_at = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
serialisers.py
class BookSerializers(ModelSerializer):
class Meta:
model = Book
fields = ('id', 'name', 'author')
views.py
class BookListApiView(ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers
permission_classes = [AllowAny, ]
class BookCreateApiView(CreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers
permission_classes = [AllowAny, ]
class BookRetrieveUpdateDeleteView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers
permission_classes = [AllowAny, ]
tests.py
LIST_BOOK_API_URL = reverse('book:list')
CREATE_BOOK_API_URL = reverse('book:create')
DETAIL_BOOK_API_URL = reverse('book:detail', kwargs={'pk': 1})
class TestBookApiView(TestCase):
def setUp(self):
self.client = APIClient()
def test_create_book_through_api(self):
payload = {
'name': 'this is book',
'author': 'test author'
}
res = self.client.post(CREATE_BOOK_API_URL, payload)
self.assertEqual(res.status_code, status.HTTP_201_CREATED)
def test_listing_book_through_api(self):
Book.objects.create(
name='test',
author='testing',
)
res = self.client.get(LIST_BOOK_API_URL)
self.assertEqual(res.status_code, status.HTTP_200_OK)
self.assertContains(res, 'test')
def test_retreiving_book_through_api(self):
Book.objects.create(
name='test',
author='testing',
)
res = self.client.get(DETAIL_BOOK_API_URL)
print(DETAIL_BOOK_API_URL)
self.assertEqual(res.status_code, status.HTTP_200_OK)
urls.py [для приложения книги]
app_name = 'book'
urlpatterns = [
path('list/', BookListApiView.as_view(), name='list'),
path('create/', BookCreateApiView.as_view(), name='create'),
path('<int:pk>/', BookRetrieveUpdateDeleteView.as_view(), name='detail'),
]
urls. py [main]
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('book.urls')),
]
результаты теста
..F
======================================================================
FAIL: test_retreiving_book_through_api (book.tests.TestBookApiView)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/user/web/book/tests.py", line 39, in test_retreiving_book_through_api
self.assertEqual(res.status_code, status.HTTP_200_OK)
AssertionError: 404 != 200
----------------------------------------------------------------------
Ran 3 tests in 0.040s
FAILED (failures=1)
my Dockerfile
# the base image for the python that we are using for the project
FROM python:3.8.1-alpine
ENV PYHTONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
# creating a folder.
RUN mkdir -p /home/user
ENV HOME=/home/user
ENV APP_HOME=/home/user/web
WORKDIR ${APP_HOME}
RUN mkdir ${APP_HOME}/staticfiles
RUN mkdir ${APP_HOME}/media
RUN apk update \
&& apk add postgresql-dev gcc python3-dev musl-dev
RUN apk add zlib zlib-dev jpeg-dev
RUN pip install --upgrade pip
COPY ./requirements.txt ${APP_HOME}/requirements.txt
RUN pip install -r requirements.txt
COPY entrypoint.sh ${APP_HOME}/entrypoint.sh
COPY . ${APP_HOME}
RUN adduser -D user
USER user
ENTRYPOINT [ "/home/user/web/entrypoint.sh" ]
Я почти на 100% уверен, что объект создан и эта функция работает. Поскольку я проверил его в браузере, он отлично работает. И если я проверю, это работает без Docker. Пожалуйста, дайте мне знать, что мне не хватает, чтобы пройти тесты.