Руководство по Mockito, платформе модульного тестирования Java.
Руководство по Mockito, платформе модульного тестирования Java.

Обзор

Фреймворк Mockito — это базовый фреймворк для модульного тестирования. В этой статье будут представлены его использование и функции, а также приведены соответствующие примеры в качестве справочного материала. Подробные бизнес-сценарии см. в написании модульного теста в проекте. В конце статьи также есть ссылки на соответствующие статьи о модульном тестировании, вы можете перейти и узнать о них больше.

1. Проверка поведения

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

Язык кода:javascript
копировать
@Test
public void test1() {
    final List mockList = Mockito.mock(List.class);
    mockList.add("mock1");
    mockList.get(0);
    mockList.size();
    mockList.clear();
    // Метод проверки isuse (по умолчанию 1 раз)
    Mockito.verify(mockList).add("mock1");
    // Способ проверки использовался 1 раз
    Mockito.verify(mockList, Mockito.times(1)).get(0);
    // Способ проверки использовался хотя бы 1 раз
    Mockito.verify(mockList, Mockito.atLeast(1)).size();
    // Не указан метод аутентификации
    Mockito.verify(mockList, Mockito.never()).contains("mock2");
    // Метод проверки проверен не более 5 раз.
    Mockito.verify(mockList, Mockito.atMost(5)).clear();
    // Укажите таймаут вызова метода
    Mockito.verify(mockList, timeout(100)).get(0);
    // Количество раз, которое необходимо выполнить в течение указанного времени.
    Mockito.verify(mockList, timeout(200).atLeastOnce()).size();
}

2. Как сделать тестовые заглушки

По умолчанию все функции возвращают значения. По умолчанию фиктивная функция возвращает значение null, пустую коллекцию или встроенный тип, обернутый типом объекта. Например, соответствующими типами объектов 0 и false являются Integer и Boolean;

После вызова функции тестовой заглушки она будет последовательно возвращать фиксированное значение;

Mockito не может работать, когда (…).thenReturn (…) для статических и финальных методов.

Язык кода:javascript
копировать
Язык кода:javascript
копировать
@Testpublic void test2() {    //Статический импорт, уменьшите объём кода: import static org.mockito.Mockito.*;final ArrayList mockList = mock(ArrayList.class);// Установите возвращаемое значение вызова метода if(mockList.add("test2")).thenReturn(true);    doReturn(true).when(mockList).add("test2");    System.out.println(mockList.add("test2"));  //true// Установите вызов метода для выдачи исключения if(mockList.get(0)).thenThrow(new RuntimeException());    doThrow(new RuntimeException()).when(mockList).get(0);    System.out.println(mockList.get(0));    //throw RuntimeException// Укладка без обратного метода    doNothing().when(mockList).clear();    // Сделать тестовые заглушки для обратных вызовов (перехват возвращаемых методов) окончательными. Answer<String> answer = new Answer<String>() {        @Overridepublic String answer(InvocationOnMock invocationOnMock) throws Throwable {            final List mock = (List) invocationOnMock.getMock();            return"mock.size result => " + mock.size();        }    };    when(mockList.get(1)).thenAnswer(answer);    doAnswer(answer).when(mockList).get(1);    System.out.println(mockList.get(1));    //mock.size result => 0// Для нескольких заглушек одного и того же метода преобладает последний if(mockList.get(2)).thenReturn("test2_1");    when(mockList.get(2)).thenReturn("test2_2");    System.out.println(mockList.get(2));    //test2_2    System.out.println(mockList.get(2));    //test2_2// Установите несколько вызовов одного и того же типа, когда(mockList.get(3)).thenReturn("test2_1", "test2_2");    when(mockList.get(3)).thenReturn("test2_1").thenReturn("test2_2");    System.out.println(mockList.get(3));    //test2_1    System.out.println(mockList.get(3));    //test2_2// Делайте тестовые заглушки для последовательных вызовов (создавайте тестовые заглушки для одного и того же вызова функции с разными возвращаемыми значениями или исключениями) if(mockList.get(4)).thenReturn("test2").thenThrow(new RuntimeException());    doReturn("test2").doThrow(new RuntimeException()).when(mockList).get(4);    System.out.println(mockList.get(4));    //test2    System.out.println(mockList.get(4));    //throw RuntimeException// Без метода укладки, возврат к значению по умолчанию    System.out.println(mockList.get(99));    //null}

3. Сопоставитель параметров

Сопоставители параметров делают проверочные и тестовые заглушки более гибкими;

ради разумности Использованиесложныйиз Сопоставление параметров,использовать equals () и anyX () Сопоставитель сделает тестовый код более кратким и простым. Иногда вам приходится рефакторить свой код для использования equals () соответствовать или реализовать equals () Функции, которые помогут вам при тестировании;

Если вы используете средство сопоставления параметров, все параметры должны быть предоставлены средством сопоставления;

Поддержка сопоставления пользовательских параметров;

Язык кода:javascript
копировать

@Test
public void test3() {
    final Map mockMap = mock(Map.class);
// Нормальное испытание на сваю
when(mockMap.get("key")).thenReturn("value1");
    System.out.println(mockMap.get("key"));     //value1
// Для гибкости используйте средство сопоставления параметров
when(mockMap.get(anyString())).thenReturn("value2");
    System.out.println(mockMap.get(anyString()));   //value2
    System.out.println(mockMap.get("test_key"));    //value2
    System.out.println(mockMap.get(0)); //null
// При наличии нескольких входных параметров либо все они должны быть сопоставлены средством сопоставления параметров, либо ни один из них не должен использоваться, иначе возникнет исключение.
when(mockMap.put(anyString(), anyInt())).thenReturn("value3");
    System.out.println(mockMap.put("key3", 3));     //value3
    System.out.println(mockMap.put(anyString(), anyInt()));     //value3
    System.out.println(mockMap.put("key3", anyInt()));    //аномальный
// поведенческая проверка, также поддерживает использование сопоставления параметров
    verify(mockMap, atLeastOnce()).get(anyString());
    verify(mockMap).put(anyString(), eq(3));
    // Пользовательский инструмент сопоставления параметров
final ArgumentMatcher<ArgumentTestRequest> myArgumentMatcher = new ArgumentMatcher<ArgumentTestRequest>() {
        @Override
public boolean matches(ArgumentTestRequest request) {
            return
"name".equals(request.getName()) || "value".equals(request.getValue());
        }
    };
    // Пользовательский инструмент сопоставления параметровиспользовать
final ArgumentTestService mock = mock(ArgumentTestService.class);
when(mock.argumentTestMethod(argThat(myArgumentMatcher))).thenReturn("success");
    doReturn("success").when(mock).argumentTestMethod(argThat(myArgumentMatcher));
    System.out.println(mock.argumentTestMethod(new ArgumentTestRequest("name", "value")));  // success
    System.out.println(mock.argumentTestMethod(new ArgumentTestRequest()));     //null
}

4. Проверка последовательности выполнения

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

Вы можете создавать объекты InOrder только из тех макетных объектов, порядок которых необходимо проверить;

Язык кода:javascript
копировать

@Test
public void test4() {
    // Проверьте порядок выполнения нескольких методов одного и того же объекта.
final List mockList = mock(List.class);
    mockList.add("first");
    mockList.add("second");
    final InOrder inOrder = inOrder(mockList);
    inOrder.verify(mockList).add("first");
    inOrder.verify(mockList).add("second");
    // Проверка нескольких объектов и нескольких методов в порядке выполнения
final List mockList1 = mock(List.class);
final List mockList2 = mock(List.class);
    mockList1.get(0);
    mockList1.get(1);
    mockList2.get(0);
    mockList1.get(2);
    mockList2.get(1);
    final InOrder inOrder1 = inOrder(mockList1, mockList2);
    inOrder1.verify(mockList1).get(0);
    inOrder1.verify(mockList1).get(2);
    inOrder1.verify(mockList2).get(1);
}

5. Убедитесь, что операции взаимодействия не выполняются на фиктивных объектах.

Некоторые пользователи могут часто использоватьverifyNoMoreInteractions(), даже в каждой тестовой функции. НоverifyNoMoreInteractions() не рекомендуется использовать в каждой тестовой функции;

verifyNoMoreInteractions() — это просто удобная проверка в интерактивном наборе тестов, когда нужно убедиться в отсутствии избыточных вызовов;

Язык кода:javascript
копировать
@Testpublicvoidtest5(){    // Убедитесь, что взаимодействие никогда не выполнялось окончательно. List mock = mock(List.class);    mock.add("first");    verify(mock, never()).add("test5");   //проходить    verify(mock, never()).add("first");  //аномальный// Убедитесь, что макетный объект не взаимодействовал с финальным List mock1 = mock(List.class);    final List mock2 = mock(List.class);    verifyZeroInteractions(mock1);  //проходить    verifyNoMoreInteractions(mock1, mock2); //проходить    verifyZeroInteractions(mock, mock2);  //аномальный// Примечание. Возможно, вам понадобится только проверить предыдущую логику, но добавление последней строки вызовет исключение. Рекомендуется проверять на уровне метода, например: Never() //;      При проверке наличия избыточных вызовов вы можете использовать этот метод. Вот так: окончательный List mockList = mock(List.class);    mockList.add("one");    mockList.add("two");    verify(mockList).add("one");    // проходить    verify(mockList, never()).get(0);    //проходить    verifyZeroInteractions(mockList);   //аномальный}

6. Используйте аннотации, чтобы упростить создание макета объекта.

Уведомление! Перед запуском тестовой функции необходимо вызвать следующий код, который обычно размещается в базовом классе тестового класса или средства запуска тестов:

Язык кода:javascript
копировать
MockitoAnnotations.initMocks(this);
Также доступно использование встроенного runner: MockitoJUnitRunner или rule : MockitoRule;
// заменять mock(ArgumentTestService.class) создать макет объекта;
@Mock
private ArgumentTestService argumentTestService;
// Если модификация аннотации изобъекта изменена на переменные-члены, определение @Mock изmockобъект будет автоматически внедрено;
@InjectMocks
private MockitoAnnotationServiceImpl mockitoAnnotationService;
@Test
public void test6() {
    // Уведомление! Перед запуском тестовой функции необходимо вызвать следующий код. Обычно он размещается в тестовом классе, базовом классе или тесте. в бегуне;
MockitoAnnotations.initMocks(this);
    when(argumentTestService.argumentTestMethod(new ArgumentTestRequest())).thenReturn("success");
    System.out.println(argumentTestService.argumentTestMethod(new ArgumentTestRequest()));  //success
    System.out.println(mockitoAnnotationService.mockitoAnnotationTestMethod()); //null
}

7. Мониторинг реальных объектов (частичный макет)

Шпионский объект может быть создан для реального объекта. Когда вы используете этот шпионский объект, реальный объект также будет вызываться, если только его функция не заглушена;

Используйте шпионские объекты как можно меньше и будьте осторожны при их использовании. Например, шпионские объекты можно использовать для работы с устаревшим кодом;

stub В грамматике также предусмотрены разделы mock Метод может вызывать настоящий метод; полностью mock: Содержимое, упомянутое выше, полностью издевательский, то есть созданный mock объект, реальный объект не имеет значения, издевательство Методы объекта по умолчанию являются базовыми реализациями и возвращают базовые типы. Может быть создан на основе интерфейсов и классов реализации. mock объект. часть mock: так называемыйчасть издевательский, то есть созданный mock Объект основан на реальном объекте, макет Все методы объекта по умолчанию используют методы реального объекта, если только stub После этого будет stub будет преобладать. Создать на основе класса реализации mock объект, иначе нет stub В этом случае при вызове реального метода возникнет исключение. Примечание: Mockito Прокси-функция не вызывается для реального объекта, на самом деле она копирует реальный объект. Поэтому, если вы сохраняете реальный объект и взаимодействуете с ним, не ждите правильных результатов от мониторинга объекта. Когда вы вызываете метод отслеживаемого объекта, который еще не был stub Соответствующая функция реального объекта вызываться не будет, и вы не увидите никаких эффектов на реальный объект.

Язык кода:javascript
копировать
@Testpublic void test7() {    // stubpartmock (на самом деле в заглушке он называется «использовать»). Примечание. Вам необходимо издеваться над классом реализации, иначе произойдет окончательное исключение. StubTestService stubTestService = mock(StubTestServiceImpl.class);when(stubTestService.stubTestMethodA("paramA")).thenCallRealMethod();    doCallRealMethod().when(stubTestService).stubTestMethodB();    System.out.println(stubTestService.stubTestMethodA("paramA"));  //stubTestMethodA is called, param = paramA    System.out.println(stubTestService.stubTestMethodB());  //stubTestMethodB is called    System.out.println(stubTestService.stubTestMethodC());  //null// spyчастьmockfinal LinkedList<String> linkedList = new LinkedList();    final LinkedList spy = spy(linkedList);    spy.add("one");    spy.add("two");    doReturn(100).when(spy).size();    when(spy.get(0)).thenReturn("one_test");    System.out.println(spy.size()); //100    System.out.println(spy.get(0)); //one_test    System.out.println(spy.get(1)); //two// Шпиона можно сравнить с АОП. В шпионе, поскольку по умолчанию вызывается реальный метод, второй способ записи не эквивалентен первому способу записи, и этот способ записи не рекомендуется.    doReturn("two_test").when(spy).get(2);    when(spy.get(2)).thenReturn("two_test"); //аномальный java.lang.IndexOutOfBoundsException: Index: 2, Size: 2    System.out.println(spy.get(2));   //two_test// spyобъект — это просто реальный Объекткопировать, настоящий Объект Изменить не влияет на spyобъектfinal List<String> arrayList = new ArrayList<>();    final List<String> spy1 = spy(arrayList);    spy1.add(0, "one");    System.out.println(spy1.get(0));    //one    arrayList.add(0, "list1");    System.out.println(arrayList.get(0));   //list1    System.out.println(spy1.get(0));    //one// Если вы хотите вызвать настоящий метод после заглушки метода, вы можете сбросить (шпионить) финал ArrayList<String> arrayList1 = new ArrayList<>();    final ArrayList<String> spy2 = spy(arrayList1);    doReturn(100).when(spy2).size();    System.out.println(spy2.size());    //100    reset(spy2);    System.out.println(spy2.size());    //0}

восемь, @Mockи*@Spy* Использование

  • @Mock эквивалентен Mockito.mock(Object.class);
  • @Spy эквивалентен Mockito.spy (obj);
Язык кода:javascript
копировать
Различие между макетным объектом и шпионским объектом:
Язык кода:javascript
копировать
Mockito.mockingDetails(someObject).isMock();
Mockito.mockingDetails(someObject).isSpy();
@Mock
private StubTestService stubTestService;
@Spy
private StubTestServiceImpl stubTestServiceImpl;
@Spy
private StubTestService stubTestServiceImpl1 = new StubTestServiceImpl();
@Test
public void test8() {
    MockitoAnnotations.initMocks(this);
    // макетный объект возвращается к состоянию по умолчанию
    System.out.println(stubTestService.stubTestMethodB());  //null
// шпионский объект вызывает настоящий метод
    System.out.println(stubTestServiceImpl.stubTestMethodC());  //stubTestMethodC is called
    System.out.println(stubTestServiceImpl1.stubTestMethodA("spy"));  //stubTestMethodA is called, param = spy
// Различие между макетным объектом и шпионским объектом
    System.out.println(mockingDetails(stubTestService).isMock());   //true
    System.out.println(mockingDetails(stubTestService).isSpy());    //false
    System.out.println(mockingDetails(stubTestServiceImpl).isSpy());    //true
}

9. ArgumentCaptor записывает параметры метода для проверки. (можно использовать вместо средства сопоставления параметров)

В некоторых сценариях необходимо не только проверить возвращаемое значение и вызов метода, но также проверить параметры, переданные методу после серии взаимодействий. Затем мы можем использовать средство захвата параметров, чтобы захватить параметры, переданные методу, для проверки, чтобы увидеть, соответствует ли он нашим требованиям. ArgumentCaptor представлять проходить ArgumentCaptor Объект forClass (Class ArgumentCaptor из Api argument.capture () Параметры метода захвата argument.getValue () Получите значение параметра метода. Если метод вызывается несколько раз, он вернет последнее значение параметра. argument.getAllValues () После многократного вызова метода он возвращает несколько значений параметров.

Язык кода:javascript
копировать
@Test
public void test9() {
    List mock = mock(List.class);
    List mock1 = mock(List.class);
    mock.add("John");
    mock1.add("Brian");
    mock1.add("Jim");
    // Получить параметры метода
    ArgumentCaptor argument = ArgumentCaptor.forClass(String.class);
    verify(mock).add(argument.capture());
    System.out.println(argument.getValue());    //John
// Позвоните несколько раз, чтобы получить последнее
    ArgumentCaptor argument1 = ArgumentCaptor.forClass(String.class);
    verify(mock1, times(2)).add(argument1.capture());
    System.out.println(argument1.getValue());    //Jim
// Получить все параметры звонка
    System.out.println(argument1.getAllValues());    //[Brian, Jim]
}

10. Упростите создание ArgumentCaptor

Язык кода:javascript
копировать
@Mock
private List<String> captorList;
@Captor
private ArgumentCaptor<String> argumentCaptor;
@Test
public void test10() {
    MockitoAnnotations.initMocks(this);
    captorList.add("cap1");
    captorList.add("cap2");
    System.out.println(captorList.size());
    verify(captorList, atLeastOnce()).add(argumentCaptor.capture());
    System.out.println(argumentCaptor.getAllValues());
}

11. Расширенные функции: индивидуальная информация об ошибках проверки.

Язык кода:javascript
копировать
@Test
public
void
test11()
{
    final ArrayList arrayList = mock(ArrayList.class);
    arrayList.add("one");
    arrayList.add("two");
    verify(arrayList, описание("size() не была вызвана")).size();
    // org.mockito.exceptions.base.MockitoAssertionError: size() не вызывается
    verify(arrayList, timeout(200).times(3).description("Проверка не удалась")).add(anyString());
    //org.mockito.exceptions.base.MockitoAssertionError: Аутентификация не удалась
}

12. Расширенные функции: изменение возвращаемого значения по умолчанию для вызовов без тестовых заглушек.

  • Можно определить стратегии для создания возвращаемого значения фиктивного объекта. Это расширенная функция.,Вообще говоря,Вам не нужно писать подобные тесты;
  • Это очень полезно для устаревших систем. Вы можете указать ответ по умолчанию, если вам не нужно заглушать вызов функции;
Язык кода:javascript
копировать
@Test
public void test12(){
    // Создать макет объекта, использовать возврат по умолчанию
final ArrayList mockList = mock(ArrayList.class);
    System.out.println(mockList.get(0));    //null
// Эта реализация сначала пробует глобальную конфигурацию, если глобальной конфигурации нет, она отвечает по умолчанию, что возвращает 0, пустой набор, ноль и т. д.
// Эталонная конфигурация возврата: ReturnsEmptyValues
    mock(ArrayList.class, Answers.RETURNS_DEFAULTS);
// ReturnsSmartNulls сначала пытается вернуть нормальные значения (0, пустая коллекция, пустая строка и т. д.), а затем пытается вернуть SmartNull.
// Если в конечном итоге он вернет объект, он просто вернет ноль. Обычно используется при работе с устаревшим кодом.
// Эталонная конфигурация возврата: ReturnsMoreEmptyValues
    mock(ArrayList.class, Answers.RETURNS_SMART_NULLS);
// Без стабизметода будет вызван настоящий метод.
//    Примечание 1. Когда заглушка имитирует использование (mock.getSomething ()) .thenReturn (fakeValue) вызовет метод из. для часть имитирует рекомендуемый синтаксис usedoReturn.
//    Примечание 2. Если моделирование представляет собой сериализацию и десериализацию, то этот ответ не будет понимать общие метаданные.
    mock(ArrayList.class, Answers.CALLS_REAL_METHODS);
// Глубокая заглушка для вложения Объектмокков. Ссылка: https://www.cnblogs.com/Ming8006/p/6297333.html.
    mock(ArrayList.class, Answers.RETURNS_DEEP_STUBS);
// ReturnsMocks сначала пытается вернуть нормальные значения (0, пустую коллекцию, пустую строку и т. д.), а затем пытается вернуть макеты.
// Если тип возвращаемого значения не может быть имитирован (например, он является окончательным), возвращается значение null.
    mock(ArrayList.class, Answers.RETURNS_MOCKS);
//  После вызова метода макетного Объекта вы можете вернуться самостоятельно (аналогично режиму конструктора)
    mock(ArrayList.class, Answers.RETURNS_SELF);
// Пользовательский возврат
final Answer<String> answer = new Answer<String>() {
        @Override
public String answer(InvocationOnMock invocation) throws Throwable {
            return
"test_answer";
        }
    };
    final ArrayList mockList1 = mock(ArrayList.class, answer);
    System.out.println(mockList1.get(0));   //test_answer
}

13. Соответствующие учебные материалы

  • Английская версия Javadoc Mockito: https://javadoc.io/static/org.mockito/mockito-core/3.3.3/org/mockito/Mockito.html
  • Mockito Китайская документация (часть):Модульное тестированиеострое оружие-Mockito Китайская документация_mockitoОфициальный документ сайта-CSDNблог
  • Mockito Руководство по использованию: Учебное пособие по Mockito - Мин - Блог Сад
  • Использование средства захвата параметров: https://www.journaldev.com/21892/mockito-argumentcaptor-captor-annotation.
  • использовать ArgumentCaptor (перехватчик аргументов) Параметры метода захвата для проверки: https://www.iteye.com/blog/hotdog-916364
  • Изменять mock Возвращаемое значение: обработка RETURNS_DEEP_STUBSдляenumиз в Mockito. – Е Мин из одинокой лампы
  • Узнайте о Mockito за пять минут: https://www.iteye.com/blog/liuzhijun-1512780
  • использовать Mockito руководить Модульное тестирование:https://www.iteye.com/blog/qiuguo0205-1443344
  • JUnit + Mockito Модульное тестирование:JUnit + Mockito Модульное тестирование(два)_invocationonmock-CSDNблог
  • Mockito середина*@Mock* и*@InjectMock: href="https://www.cnblogs.com/langren1992/p/9681600.html"title="https://www.cnblogs.com/langren1992/p/9681600.html">https://www.cnblogs.com/langren1992/p/9681600.html*
  • mockito Два вида части mock реализация,spy、callRealMethod:mockitoДва вида частиmockреализация,spy、callRealMethod - Капля в море - Блог Сад
  • Mockito среднее одеяло Mocked свойства и методы изобъекта из Значение по умолчанию: Mockito среднее одеяло Mocked изобъект Свойства и методы из Значение по умолчанию - Boblim - Блог Сад
  • Mockito, инструмент модульного тестирования: роль Mockito_mockito, инструмента модульного тестирования — блог CSDN
  • Представляем Mockito для тестирования@Spy** и*@Mock: href="https://blog.csdn.net/message_lx/article/details/83308114"title="https://blog.csdn.net/message_lx/article/details/83308114">https://blog.csdn.net/message_lx/article/details/83308114***
  • Предварительное исследование Mockito (включая примеры): https://www.iteye.com/blog/sgq0085-2031319.
  • Статистика покрытия тестами. Используйте идею подключаемого модуля JaCoCo для подсчета модульных тестов.
  • **** Тестовое покрытие невозможно решить статистически: [идея Модульное тестирование Покрытие не показывает проблем, нет coverage result_idea no coverage результаты-CSDNblog
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose