Практические основы тестирования на php Unit-test: понятия, тонкости, пути решения, вопросы для проработки.
PHPUnittest fast start
Разработано http://webgloss.ru
Web-программирование
Лекция #6. Введение в Django web-framework
Цикл лекций читается в Омском государственном университете им. Ф.М.Достоевского на факультете компьютерных наук.
Лектор: Яковенко Кирилл Сергеевич.
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
Как-то так происходит, что “на 10 девчонок по статистике 9 ребят”, а точнее на группу из 5-7 разработчиков – 1 тестировщик. Или его нет совсем. Так что очень часто приходится и код писать, и тестировать, а дата релиза все ближе и ближе.
В тех случаях, когда мы пишем веб-приложение, помочь в нашей нелегкой судьбе может бодрящий микс из Selenium и TestNG... Как это сделали мы, какие потом получили выводы и результаты — все это я и хочу рассказать и показать
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — проблемы и решения.
Конференция Dev Party (http://devparty.ru).
Вологда, 02.04.2016.
«JSSDK: Начало» Когда использовать готовые решения, а когда писать самим. Какие шаги нужно сделать, чтобы ваша работа не оказалась напрасной и принесла пользу окружающим. Все эти нюансы будут рассмотрены на примере внутреннего фреймворка, который возник вследствие необходимости объединения кодовой базы двух проектов.
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
Сергей Коржнев
Архитектор версии 1.4 2ГИС Web API
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Тезисы:
● Как организован код в старой версии.
● Вдумчиво смотрим, как мы используем Yii, хватаемся за голову и клавиатуру. Там отрезаем, тут пришиваем, и вуаля!
● Ну и делаем выводы, как мы забороли две классические проблемы программирования: борьба с дублированием кода и сложностью системы.
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
Вячеслав Марков, QA engineer в Weezlabs
Я расскажу о том, как в нашей фирме организовано тестирование бэкенда с помощью тестового фреймворка TestNG и Java. Расскажу о data-driven тестировании и о том, почему его удобно применять. Покажу и опишу разработанную нами структуру типового тестового проекта. Представлю применяемые нами способы сбора и документирования результатов, а так же их анализ в условиях CI.
Продвинутое использование Celery — Александр КошелевYandex
Доклад будет интересен как тем, кто уже знаком с библиотекой для реализации очередей задач Celery, так и тем, кто только собирается её попробовать. Основные темы выступления:
- как устроена Celery;
- как перейти на альтернативные брокеры;
- как обеспечить эффективный доступ к ресурсам;
- как отслеживать работоспособность процессов Celery
Мир мобильных телефонов очень сильно изменил нашу жизнь. В наше время невозможно представить современного человека, без этого чудо устройства. На рынке появляется все больше устройств и приложений. И чтобы удобнее пользоваться этими приложениями пользователи выбирают “умные” телефоны, или как их еще принято называть смартфоны. В своем докладе я хочу поделиться своим опытом автоматизации приложений под Android и iOS. Я расскажу о том, какие инструменты автоматизации я использовал. Поговорим о недостатках этих инструментов и какие из них стоит использовать у себя на проекте.
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
Курс "Промышленное программирование на Java". Набор лекций 1. "Сборка и компоновка приложения".
Сборка проекта. Apache Maven. Компоновка и верхнеуровневый дизайн приложения. Depencency Injection. Spring Framework. Spring Boot. Обзор популярных утилитарных библиотек. Логгинг, slf4j, log4j.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
Attract Group is an IT consulting firm that provides full-cycle web and mobile development services. They have expertise in areas like e-commerce, food delivery apps, medical software, education technology, and more. The document describes some of Attract Group's past projects like e-commerce stores, food ordering apps, property management software, and cryptocurrency tools. It also lists the technologies and services Attract Group offers to clients, such as web and mobile development, QA, design, and consulting.
Attract group mobile app development portfolio Attract Group
Attract Group is an IT services company specializing in web and mobile development. They provide full-cycle development services including web development, mobile app development, QA testing, UI/UX design, and more. They have experience developing apps and websites across many industries for clients located around the world. Their goal is to help businesses adapt to new digital technologies and optimize their processes.
Attract Group mobile app portfoio presentationAttract Group
This document provides summaries of several mobile and web application projects completed by Attract Group. It includes summaries of applications for garbage collection scheduling, a restaurant guide, managing skyscraper facilities, an online grocery store, a fishing equipment store, a university campus navigation app, a pet social network, an online tour creation platform, and an expert matching service. Testimonials are also provided from clients praising Attract Group's technical skills, strategic guidance, ability to implement new ideas, and dedication to achieving successful project results.
Presentation Android Architecture ComponentsAttract Group
The document introduces several Android Architecture Components: Lifecycle, LiveData, ViewModel, and Room. Lifecycle allows observing activity and fragment lifecycles. LiveData allows updating UI when underlying data changes. ViewModel stores UI-related data that survives configuration changes. Room provides an abstraction layer over SQLite to allow for more robust database access.
2. Содержание
1. Предисловие
2. Django Rest Framework
3. GraphQL
4. Сравнение
a. Роутинг
b. Запросы (front requests)
c. Фильтрация
d. CRUD
e. Права доступа (permissions)
f. Версионность
g. API документация
5. Результат
4. Предисловие. Монолитные страницы
- Монолитные страницы (monolithic style)
Рендеринг на стороне сервера, запросы на перерисовку отдельных частей web-
страниц посредством ajax.
5. Предисловие. REST
- REST
Архитектурный стиль взаимодействия компонентов распределённого приложения в
сети, пользуется популярностью с 2005 г.
Применяется для API, сайтов (SPA) и мобильных приложений.
11. Сравнение. Запросы
Запрос на сущность
1. GET /api/v1/users/
2. GET /api/v1/buildings/
Оптимизация кол-ва запросов:
● Кастомные запросы для получение данных с разных
сущностей.
● Вложенные данные djangorestframework-expander
Единая точка входа
GET /graphql
1. query {
2. allUsers{ ... }
3. allBuildings{ … }
4. }
Оптимизация получения вложенных данных resolve_{method}
select_related и prefetch_related
12. Сравнение. Фильтрация
django-filter
1. class UserView(ListModelMixin, GenericViewSet):
2. serializer_class = UserSerializer
3. queryset = User.objects.all()
4. filter_backends =
(django_filters.rest_framework.DjangoFilterBackend,)
5. filter_fields = “__all__”
6. filter_class = UserCustomFilter
django-filter
1. class UserType(DjangoObjectType):
2. class Meta:
3. model = User
4. interfaces = (relay.Node,)
5. filter_fields = ['id', 'name']
6. class Query(ObjectType):
all_users = DjangoFilterConnectionField(UserType,
filterset_class=UserCustomFilter)
13. Сравнение. Фильтрация
django-filter
1. GET /api/v1/users/?category=1
2. GET /api/v1/users/?search=oleg
3. GET /api/v1/users/?search=oleg
4. GET /api/v1/users/?username__contains=oleg
django-filter
1. query{
2. allUsers(category: "QnVpbGRpbmdUeXBlOjE="){ ... }
3. allUsers(name: "oleg"){ ... }
4. allUsers(name_Icontains: "oleg"){ ... }
5. }
14. Сравнение. CRUD
Serializers
1. class BuildingView(RetrieveModelMixin, UpdateModelMixin,
DestroyModelMixin, ListModelMixin, CreateModelMixin,
GenericViewSet):
2. serializer_class = BuildingSerializer
Mutations
Установка пакета с доп. функциями
pip install graphene-django-extras
1. class BuildingSerializerMutation(DjangoSerializerMutation):
2. class Meta:
3. serializer_class = BuildingSerializer
16. Сравнение. CRUD
Serializers
Создание building
POST /api/v1/building/
1. {
2. "address": "test",
3. "name": "test",
4. }
Mutations
Создание building
1. mutation{
2. buildingCreate(newBuilding:{name: "test", address: "test
address"}){
3. building {
4. id
5. name
6. }
7. }
8. }
17. Сравнение. CRUD
Serializers
Изменение building
PATCH | PUT /api/v1/building/{id}/
1. {
2. "address": "string",
3. "name": "string",
4. }
Mutations
Изменение building
1. mutation{
2. buildingUpdate(newBuilding: {id: "4", name: "new name"}){
3. building{
4. id
5. name
6. }
7. ok
8. errors{
9. field
10. messages
11. }
12. }
13. }
18. Сравнение. CRUD
Serializers
REST запросы для CRUD оперций
1. DELETE /api/v1/building/{id}/
Mutations
Удвление building
1. mutation{
2. buildingDelete(id: "3"){
3. building {
4. id
5. name
6. }
7. }
8. }
19. Сравнение. Права доступа
Ограничение прав на уровне Request
1. class BuildingView(RetrieveModelMixin,
CreateModelMixin, GenericViewSet):
2. queryset = Building.objects.all()
3. permission_classes = (IsAuthenticated,
IsOwnerOrReadOnly)
Установка пакета
pip install graphene-permissions
1. class BuildingType(AuthNode, DjangoObjectType):
2. permission_classes = (AllowAuthenticated,)
3. class Meta:
4. model = Building
5. interfaces = (relay.Node,)
20. Сравнение. Права доступа
Кастомные права
1. class IsOwnerOrReadOnly(permissions.BasePermission):
2. """
3. Object-level permission to only allow owners of an object to
edit it.
4. """
5. def has_object_permission(self, request, view, obj):
6. if request.method in permissions.SAFE_METHODS:
7. return True
8. return obj == request.owner
1. class AuthNode:
2. permission_classes = (AllowAny, )
3. @classmethod
4. def get_node(cls, id, context, info):
5. def has_permission():
6. return all([perm() for perm in
cls.permission_classes])
7. if has_permission():
8. try:
9. object_instance =
cls._meta.model.objects.get(id=id)
10. except cls._meta.model.DoesNotExist:
11. object_instance = None
12. return object_instance
21. Сравнение. Права доступа
Пример запрета на все запросы
1. class DenyAny:
2. """
3. Deny for all permission
4. """
5. def has_node_permission(self, info, id):
6. return False
7. def has_mutation_permission(self, input, context, info):
8. return False
9. def has_filter_permission(self, context):
10. return False
1. class AuthNode:
2. permission_classes = (AllowAny, )
3. @classmethod
4. def get_node(cls, info, id):
5. def has_permission():
6. return all([perm().has_node_permission(info, id) for
perm in cls.permission_classes])
7. if has_permission():
8. try:
9. object_instance =
cls._meta.model.objects.get(id=id)
10. except cls._meta.model.DoesNotExist:
11. object_instance = None
12. return object_instance
13. else:
14. raise PermissionDenied(PERMISSION_DENIED_MSG)
22. Сравнение. Права доступа
Подключение
1. class BuildingType(AuthNode, DjangoObjectType):
2. permission_classes = (DenyAny,)
3. class Meta:
4. model = Building
5. interfaces = (relay.Node,)
6. filter_fields = ['id', 'name']
23. Сравнение. Версионность
Роутинг
1. GET /api/v1/users/
2. GET /api/v2/users/
3. POST /api/v1/buildings/
4. POST /api/v2/buildings/
Подключение в url.py
1. urlpatterns = [
2. url(r'^api/v1/', include('users.urls_v1')),
3. url(r'^api/v2/', include('users.urls_v2')),
4. ]
Пример с мутациями
1. class Mutations(ObjectType):
2. building_create =
BuildingSerializerMutation.CreateField(deprecation_reason
='Some one deprecation message')
25. Результат
DRF GraphQL
Роутинг Нужно описывать роуты один роут на все запросы
Запросы Несколько запросов, Кастомные роуты. Экспанды для
вложенных данных
Один запрос на получение нужных данных
Фильтрация django-filter django-filter
CRUD Mixins и Serializers Mutation и Serializers
Права доступа Есть удобное управление Пакет не заработал, правил классы
Версионность Добавление новых роутов Описание устаревших переменных в документации
API документация Swagger
Вся документация для работы с django
Graphiql
Нет с коробки crud операций, permissions