iOS_Unit Тест третий — использование OCMock
iOS_Unit Тест третий — использование OCMock

OCMock

Каталог статей

1. Создание макетов объектов Создание макетов объектов

1.1. Имитация экземпляра класса.

Язык кода:javascript
копировать
// На основе класса смоделировать его экземпляр
id mockPerson = OCMClassMock([MOPerson class]);

1.2. Имитация протокола прокси.

Язык кода:javascript
копировать
// В соответствии с именем протокола смоделируйте реализованный протокол из экземпляра.
id mockProtocol = OCMProtocolMock(@protocol(MOTitleLineViewDelegate));
// Затемmockпротоколметод

1.3. Строгие классовые и протокольные издевательства.

Язык кода:javascript
копировать
// Выдает исключение при получении неожиданного метода
id strictMockClass = OCMStrictClassMock([MOPerson class]);
id strictMockProtocol = OCMStrictProtocolMock(@protocol(MOTitleLineViewDelegate));

1.4. Частичные издевательства.

Вот определение:Stub,заглушка,то естьмоделированиефункция。

Язык кода:javascript
копировать
MOPerson *aPerson = [[MOPerson alloc] init];
id partialMockPerson = OCMPartialMock(aPerson);

вызовфункция:ужезаглушкаиз Просто активируйтезаглушкаиз(Stub);еще нетзаглушкаиз Просто активируйте Исходный экземпляриз(aPerson)。

1.5 Наблюдатель издевается. Наблюдатель издевается.

Используйте официальныйизXCTNSNotificationExpectation

2. Методы заглушки Методы заглушки

2.1. Методы-заглушки, возвращающие объекты.

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andReturn(@"moxiaoyan"); 
OCMStub([mock aMethodReturningABoolean]).andReturn(YES);

2.2. Делегирование другому методу. Методы-заглушки, возвращающие значения.

Язык кода:javascript
копировать
MOPerson *anotherPerson = [[MOPerson alloc] init];
// Другой объект из метода, сигнатура метода должна быть согласованной.
OCMStub([partialMockPerson name]).andCall(anotherPerson, @selector(name));

2.3 Делегирование блоку Делегирование другому методу.

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andDo(^(NSInvocation *invocation){
    // При вызове метода name этот блок будет вызываться
    // вызов будет содержать параметры метода
    // вызов может установить возвращаемое значение
});
OCMStub([partialMock name]).andDo(nil);

2.4 Делегирование в блок Делегирование в блок.

Макетный объект будет вызывать этот блок при вызове функции. Этот блок может считывать параметры из вызывающего объекта и устанавливать возвращаемое значение.

Язык кода:javascript
копировать
OCMStub([mock someMethod]).andDo(^(NSInvocation *invocation) {
    /* block that handles the method invocation */
});

2.5 Имитация возвращаемого значения метода, который возвращает значение через параметры. Возврат значений в аргументах, передаваемых по ссылке.

2.5.1. Параметры объекта.

Возвращаемые значения через параметры:

Язык кода:javascript
копировать
// моделирование Должен вернуться из значения параметра
NSError *error = [NSError errorWithDomain:@"Не удалось получить друзей (заглушено)" code:001 userInfo:nil];
OCMStub([partialMockPerson loadFriendsWithError:[OCMArg setTo:error]]);
// вызов функции,Получить значение моделирования
NSError *resultError = nil;
[partialMockPerson loadFriendsWithError:&resultError];
NSLog(@"%@", resultError); // 001, Не удалось найти друзей (заморожено)
2.5.2. Необъектные параметры.
Язык кода:javascript
копировать
OCMStub([mock someMethodWithReferenceArgument:[OCMArg setToValue:OCMOCK_VALUE((int){aValue})]]);

Используйте то же самое 2.5.1.

2.6. Моделирование параметров блока. Вызов аргументов блока.

Язык кода:javascript
копировать
// invokeBlockпо умолчаниюмоделирование,Все параметры являются значениями по умолчанию.
OCMStub([partialMockPerson deviceWithComplete:[OCMArg invokeBlock]]);
[partialMockPerson deviceWithComplete:^(NSString * _Nonnull value) {
    NSLog(@"%@", value); // nil
}];
// invokeBlockWithArgsмоделирование,Значения параметров могут быть установлены
OCMStub([partialMockPerson deviceWithComplete:[OCMArg ignoreBlockWithArgs:@"iPhone"]]);
[partialMockPerson deviceWithComplete:^(NSString * _Nonnull value) {
    NSLog(@"%@", значение // iPhone);
}];

2.7. Вызов исключений.

При вызове функции настройки выдается исключение:

Язык кода:javascript
копировать
NSException *exception = [[NSException alloc] initWithName:@"Исключение при получении имени" причина:@"имя пусто" userInfo:nil];
OCMStub([partialMockPerson name]).andThrow(exception);

2.8. Публикация уведомлений.

Функция настройки называется,уведомить(notify

Язык кода:javascript
копировать
NSNotification *notify = [NSNotification NotificationWithName:@"уведомить" object:self userInfo:nil];
OCMStub([partialMockPerson name]).andPost(notify);

2.9. Объединение действий-заглушек.

Все операции, такие как andReturn и andPost, могут быть объединены в цепочку.

Язык кода:javascript
копировать
// моделированиеобъектбудет опубликованоуведомитьивозвращатьсяценить
OCMStub([mock someMethod]).andPost(aNotification).andReturn(aValue);

2.10. Перенаправление на реальный объект/класс.

При использовании частично имитируемых экземпляров и имитируемых методов класса вы можете перенаправить заглушенные методы в реальный объект или класс. Это полезно только при объединении операций или использовании ожиданий.

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andForwardToRealObject();

2.11. Ничего не делать.

может бытьnilвместо блока, переданного вandDo。Это лишь частичномоделированиеилимоделированиедобрыйметод Иногда полезно。в этих случаях,использоватьandDo(nil)эффективно подавлял существующиедобрыйсерединаиз Поведение。

Язык кода:javascript
копировать
OCMStub([mock someMethod]).andDo(nil);

2.12 Оправдание ожиданий XCTest (требуется OCMock3.8) Оправдание ожиданий XCTest.

Когда этот метод вызывается, ожидания среды XCTest оправдываются:

Язык кода:javascript
копировать
XCTestExpectation *expectation = [[XCTestExpectation alloc] initWithDescription:@"XCTestизожидать"];
OCMStub([partialMockPerson name]).andFulfill(expectation);

2.13. Регистрация сообщений (требуется OCMock3.8) Регистрация сообщений.

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andLog(@"%@", @"hehe");

позвони сюдаметодчас,formatпроходитьNSLog。Скорее всего, вы хотитесуществоватьцепьсерединаиспользоватьэто,может сопровождатьсяandReturn()илиandForwardToRealObject()

2.14. Включите отладку, и точки останова вступят в силу (требуется OCMock3.8).

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andBreak();

При вызове этого метода отладчик открывается так, как если бы была достигнута точка останова. Стек будет в OCMock из В стадии реализацииизгде-то закончиться,Но если вы посмотрите дальше,крест__forwarding__рамка,вы должны иметь возможность видеть свойизкодпозвони сюдаметодиз Расположение。

3. Проверка взаимодействия Проверка взаимодействия

3.1. Метод проверки получил название Verify-after-running.

Язык кода:javascript
копировать
[aPerson name];
OCMVerify([partialMockPerson name]);

проверятьnameбыл вызван тестовым кодом。нравиться Касаоеще нетпозвони сюдаметод,Будет сообщено об ошибке.

3.2 Убедитесь, что метод Stubbed называется Stubs и проверьте.

Язык кода:javascript
копировать
OCMStub([partialMockPerson name]).andReturn(@"momo");
[aPerson name];
OCMVerify([partialMockPerson name]);

Можно заглушить метод и при этом убедиться, что он был вызван.

3.3. Требуются квантификаторы.

Сколько раз вызывался метод проверки:

Язык кода:javascript
копировать
OCMVerify(atLeast(2), [partialMockPerson name]);
OCMVerify(never(),    [partialMock doStuff]);
OCMVerify(times(0),   [partialMock doStuff]);
OCMVerify(times(n),   [partialMock doStuff]);
OCMVerify(atLeast(n), [partialMock doStuff]);
OCMVerify(atMost(n),  [partialMock doStuff]);

4. Ограничения аргументов

4.1. Любое ограничение.

Язык кода:javascript
копировать
// метод-заглушка, который может ответить на любой вызов
OCMStub([partialMockPerson addChilden:[OCMArg any]]); // Параметр — любой объект
OCMStub([partialMockPerson takeMoney:[OCMArg anyPointer]]); // Параметр — любой указатель
OCMStub([partialMockPerson changeWithSelector:[OCMArg anySelector]]); // Параметр — любой селектор

4.2. Игнорирование необъектных аргументов.

stubметод,Могу ответитьнеобъектпараметризвызов(Могу ответитьпараметр Нетпроходитьизвызов:Илиобъектпараметр or необъектные параметры)

Язык кода:javascript
копировать
OCMStub([partialMockPerson setAge:0]).ignoringNonObjectArgs();

4.3. Соответствующие аргументы. Соответствующие аргументы.

stubметод,отвечать толькоСоответствие параметровизвызов

Язык кода:javascript
копировать
MOPerson *bPerson = [[MOPerson alloc] init];
OCMStub([partialMockPerson addChilden:bPerson]);
OCMStub([partialMockPerson addChilden:[OCMArg isNil]]);
OCMStub([partialMockPerson addChilden:[OCMArg isNotNil]]);
OCMStub([partialMockPerson addChilden:[OCMArg isNotEqual:bPerson]]);
OCMStub([partialMockPerson addChilden:[OCMArg isKindOfClass:[MOPerson class]]]);

вызовет anObject из aSelector метод и передать параметры в в этомметодсерединасуждениепараметрлипроходить,проходить Сразу:возвращатьсяYES, в противном случае:возвращатьсяNO

Язык кода:javascript
копировать
id anObject = nil;
SEL aSelector = @selector(addChilden:);
OCMStub([partialMockPerson addChilden:[OCMArg checkWithSelector:aSelector onObject:anObject]]);

OCMStub([partialMockPerson addChilden:[OCMArg checkWithBlock:^BOOL(id value) {
    // Определите, проходит ли параметр, если он проходит: верните YES, В противном случае: верните НЕТ
    return YES;
}]]);

4.4. Используйте сопоставление Hamcrest (еще одна библиотека, я представлю ее позже, когда у меня будет время)

Язык кода:javascript
копировать
OCMStub([partialMockPerson addChilden:startsWith(@"foo")]);

5. Издевающиеся методы класса. Издевающиеся методы класса.

5.1. Методы класса-заглушки. Методы класса-заглушки.

Язык кода:javascript
копировать
id mockPerson = OCMClassMock([MOPerson class]);
OCMStub([mockPerson mo_className]).andReturn(@"XXMOPerson");

5.2. Устранение неоднозначности методов класса и экземпляра. Устранение неоднозначности методов класса и экземпляра.

Язык кода:javascript
копировать
// (1) Если в настоящее время нет метода экземпляра с таким же именем, метод класса mo_className может быть корректно Stubiz.
NSString *className1 = [MOPerson mo_className]; // XXMOPerson
// (2) Но если метод экземпляра имеет то же имя, что и он:
NSString *instanceName = [mockPerson mo_className]; // XXMOPerson
NSString *className2 = [MOPerson mo_className]; // class MOPerson
// Вам нужно использовать следующий метод для заглушки
OCMStub(ClassMethod([mockPerson mo_className])).andReturn(@"MOMOPerson");
NSString *className3 = [MOPerson mo_className]; // XXMOPerson

5.2. Выполнена проверка вызовов методов класса.

Язык кода:javascript
копировать
[mockPerson mo_className];
OCMVerify([mockPerson mo_className]);

5.4. Восстановление класса. Устранение неоднозначности класса и методов экземпляра.

Язык кода:javascript
копировать
[mockPerson stopMocking];

6. Частичные издевательства

6.1. Методы заглушки.

Язык кода:javascript
копировать
id partialMockPerson = OCMPartialMock(aPerson);
OCMStub([partialMockPerson mo_className]).andReturn(@"Partail Class");
NSString *partialName = [partialMockPerson mo_className]; // Partail Class
NSString *personName = [aPerson mo_className]; // Partail Class

6.2. Проверка вызовов.

Язык кода:javascript
копировать
[partialMockPerson mo_className];
OCMVerify([partialMockPerson mo_className]);

6.3. Восстановление объекта.

Язык кода:javascript
копировать
[partialMockPerson stopMocking];

7. Строгие издевательства и ожидания

7.1. Установите ожидания-выполните-проверьте Ожидайте-выполните-проверьте.

Язык кода:javascript
копировать
id mockPerson = OCMClassMock([MOPerson class]);
OCMExpect([mockPerson addChilden:[OCMArg isNotNil]]);
[mockPerson addChilden:[MOPerson new]]; // Пока ни разу не ноль, проверка пройдена!
[mockPerson addChilden:nil];
OCMVerifyAll(mockPerson);

7.2. Строгие издевательства и быстрые провалы.

Язык кода:javascript
копировать
id strictPerson = OCMStrictClassMock([MOPerson class]);
[strictPerson mo_className]; // не ожидал этогометодизвызов,Значит тест провален

7.3 Заглушить действия и ожидать.

Вы также можете ожидатьизслучайиспользоватьandReturnandThrowждать。это будетсуществоватьвызовметодчасбегатьзаглушкадействовать,исуществоватьпроверятьчасубедиться, чтометодбыть реальнымвызов

Язык кода:javascript
копировать
OCMExpect([strictPerson mo_className]).andReturn(@"instance_MOPerson");
OCMExpect([strictPerson mo_className]).andThrow([NSException ...]);
[strictPerson mo_className];
OCMVerifyAll(strictPerson);

7.4. Проверка с задержкой.

Язык кода:javascript
копировать
OCMExpect([strictPerson mo_className]);
[strictPerson mo_className];
OCMVerifyAllWithDelay(strictPerson, 3.0); // NSTimeInterval, Обычно возвращается, как только ожидания оправдываются

7.5 Проверка по порядку.

один развызов Этого достаточно?существовать“Ожидаемый список”серединаиз Следующийметод,моделированиебыстро потерпит неудачу и выдаст исключение。

Язык кода:javascript
копировать
[strictPerson setExpectationOrderMatters:YES];
OCMExpect([strictPerson mo_className]);
OCMExpect([strictPerson addChilden:[OCMArg any]]);
// Если порядок вызова неправильный, тест завершится неудачей.
[strictPerson mo_className];
[strictPerson addChilden:nil];

8. Наблюдатель издевается. Наблюдатель издевается.

отOCMock 3.8Не рекомендуется поначалуиспользоватьнаблюдательмоделирование。Пожалуйста, используйте вместо этогоXCTNSNotificationExpectation

9. Продвинутые темы Продвинутые темы

9.1 Быстро не получается для обычных (хороших) макетов (требуется OCMock3.3) Быстро не получается для обычных (хороших) макетов.

strictмоделирование:вызовеще нетзаглушкаизметодвыдаст исключение Обычное моделирование: просто возвращает значение по умолчанию, функции можно настроить на быстрый сбой:

Язык кода:javascript
копировать
id mockPerson = OCMClassMock([MOPerson class]);
OCMReject([mockPerson mo_className]);

в этом случае,моделированиеприму всеметод,Кромеmo_className,Если эта функция вызывается,Будет выброшено исключение.

9.2. Повторная выдача отказоустойчивых исключений при проверке всех.

в быстром режиме,Исключения не могут привести к сбою теста.(нравиться:когдаметодизвызовкучаеще нетсуществоватьтестсередина Заканчиватьчас) OCMerifyAllвызовчас,Исключение отказоустойчивости будет выброшено повторно.,Может обеспечить обнаружение звонков из уведомлений и т. д. без необходимости

9.3. Методы-заглушки, создающие объекты.

Язык кода:javascript
копировать
MOPerson *myPerson = [[MOPerson alloc] init];
OCMStub([mockPerson copy]).andReturn(myPerson);

будет основано наметодимя,автоматическийвозвращатьсяобъектиз:allocnewcopymutableCopy (количество ссылок)

Примечание: initметод не может выполнить заглушку.,Потому что это должнометодсделан измоделирование Реализовано само собойиз。 когдаinitметодбыл сновавызовчас,будет прямымвозвращатьсямоделированиеобъектself Таким образом, вы можете эффективно заглушить выделение и инициализацию.

9.4. Метод Swizzling на основе экземпляров.

Язык кода:javascript
копировать
MOPerson *person = [[MOPerson alloc] init];
id partialMockPerson = OCMPartialMock(person);
OCMStub([partialMockPerson mo_className]).andCall(myPerson, @selector(name));

методизимясказать Можетдругой,Но подпись должна быть та же самая

9.5. Нарушение циклов сохранения. Нарушение циклов сохранения.

Язык кода:javascript
копировать
[mockPerson stopMocking];
[partialMockPerson stopMocking];

9.6. Отключение короткого синтаксиса.

Запрещать без префиксаиз Макрос:ClassMethod()atLeast()、… Использовать префиксиз Макрос:OCMClassMethod()OCMAtLeast()、…

9.7. Остановка создания макетов для определенных классов (требуется OCMock3.8) Остановка создания макетов для определенных классов.

некоторые рамкисуществоватьбегатьчасдинамическое изменениеобъектиздобрый。OCMockЭто сделано для реализации частимоделирование,иFoundationРамка изменитсядобрыйделатьдля(KVO)механизмизчасть。 нравиться Без тщательной координации,может стать причиной несчастного случая ПоведениеилиcrashOCMockЗнатьKVO,и будьте осторожны, чтобы избежать конфликта с Для других фреймворков,OCMockПредлагает только один отказмоделированиечтобы избежать несчастных случаев Поведениеизмеханизм

Язык кода:javascript
копировать
+ (BOOL)supportsMocking:(NSString **)reason {
	*reason = @"Don't want to be mocked."
    return NO;
}

проходить Реализуйте вышеизложенноеизметод,одиндобрый Можетвыбери не бытьMock。 Когда разработчик пытается создать макет для этого класса, выдается исключение, объясняющее проблему, как сказано в Допустимо, чтобы метод возвращал разные значения в отдельных вызовах, что позволяет ему реагировать на определенные условия во время выполнения. нравиться Как и ожидалосьметоддляreasonнаделятьценить,Возвращаемое значение будет игнорироваться

для всехеще нетреализовать этометодиздобрый,OCMockПредположим, это приемлемоMock

9.8 Проверка частичного макета (требуется OCMock3.8) Проверка частичного макета.

Определите, является ли объект частичного моделирования

Язык кода:javascript
копировать
BOOL isPartialMockObj = OCMIsSubclassOfMockClass(objc_getClass(partialMockPerson));

10. Ограничения

10.1. Только один Mock может одновременно заглушать методы данного класса.

Не делайте этого:

Язык кода:javascript
копировать
id mock1 = OCMClassMock([SomeClass class]);
OCMStub([mock1 aClassMethod]);
id mock2 = OCMClassMock([SomeClass class]);
OCMStub([mock2 anotherClassMethod]);

нравиться Если добавленозаглушкадобрыйметодизмоделированиеобъектеще нетвыпускать,нозаглушкаметодбудет сохраняться,Несмотря на тосуществоватьтестсередина Слишкомнравитьсяэтот。нравитьсянесколько фруктовмоделированиеобъекттакой жечасдействоватьтакой же一добрый,Поведение будет непредсказуемым.

10.2. Ожидайте, что метод Stub будет недействительным.

Язык кода:javascript
копировать
id mock = OCMStrictClassMock([SomeClass class]);
OCMStub([mock someMethod]).andReturn(@"a string");
OCMExpect([mock someMethod]);

потому чтокогдапонял раньшемоделированиеобъектизметод,StubСправлюсь со всем для этогоизвызов。意味着Несмотря на товызов Пришло времяметод,Проверка также не пройдет

Чтобы избежать этой проблемы:

  • метод1:проходитьandReturnсуществоватьExpectзаявлениесерединадобавить в
  • Метод 2: заглушка после установки ожиданий

10.3. Для некоторых специальных классов не могут быть созданы частичные симуляции.

Язык кода:javascript
копировать
id partialMockForString = OCMPartialMock(@"Foo"); // выдаст исключение

NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];
id partialMockForDate = OCMPartialMock(date); // Повлияет ли это на некоторые структуры?

не в состоянии toll-free bridged добрыйизсоздание экземпляра локальномоделирование не в состоянии Определенные создания экземпляров представлены помеченными указателями.изобъект,нравиться:NSString、на некоторых архитектурах、NSDateна некоторых архитектурах

10.4. Некоторые методы невозможно заглушить или проверить.

Язык кода:javascript
копировать
id partialMockForString = OCMPartialMock(anObject);
OCMStub([partialMock class]).andReturn(someOtherClass); // will not work

Не могущиймоделирование许多核心бегатьчасметод。включать:initclassmethodSignatureForSelector:forwardInvocation:respondsToSelectorждатьждать

10.5. Методы класса NSString и NSArray не могут быть заглушены или проверены.

Язык кода:javascript
копировать
// Невозможно вступить в силу, метод не будет заглушен.
id stringMock = OCMClassMock([NSString class]);
Язык кода:javascript
копировать
// Невозможно заглушить методы класса проверки в NSString и NSArray. Попытка сделать это не имеет никакого эффекта.
OCMStub([stringMock stringWithContentsOfFile:[OCMArg any] encoding:NSUTF8StringEncoding error:[OCMArg setTo:nil]]);

10.6. Методы класса NSManagedObject и его подклассов не могут быть заглушены или проверены.

Язык кода:javascript
копировать
// Невозможно вступить в силу, метод не будет заглушен.
id mock = OCMClassMock([MyManagedObject class]);
Язык кода:javascript
копировать
// Невозможно заглушить методы класса проверки в NSManagedObject и его подклассах. Попытка сделать это не имеет никакого эффекта.
OCMStub([mock someClassMethod]).andReturn(nil);

10.7. Невозможно проверить методы NSObject.

Язык кода:javascript
копировать
id mock = OCMClassMock([NSObject class]);
/* run code under test, which calls awakeAfterUsingCoder: */
OCMVerify([mock awakeAfterUsingCoder:[OCMArg any]]); // still fails

Невозможно использовать в NSObject Реализуйте метод из или на нем и категорию из для проверки после запуска. В некоторых случаях можно заглушить метод, а затем проверить его. Проверка после выполнения может использоваться, когда метод переопределяется в подклассе.

10.8. Невозможно проверить частные методы в основных классах Apple.

Язык кода:javascript
копировать
UIWindow *window = /* get window somehow */
id mock = OCMPartialMock(window);
/* run code under test, which causes _sendTouchesForEvent: to be invoked */
OCMVerify([mock _sendTouchesForEvent:[OCMArg any]]); // still fails

Невозможно в корне Apple Используйте частные методы в классе для проверки после запуска. В частности, в NS или UI Как и в классе с префиксом из, все методы начинаются с подчеркивания и заканчиваются суффиксом /илииз. В некоторых случаях можно заглушить метод, а затем проверить его.

10.9. Задержку нельзя использовать для проверки после запуска.

в настоящий момент Не могущийпроверять Есть задержкаизметод。这в настоящий момент只能использоватьподсуществоватьстрогиймоделированиеи ожиданиясерединаописыватьизexpect-run-verifyметод。

10.10. Используйте многопоточность при тестировании.

OCMock Не полностью потокобезопасен. до 3.2.x Версия OCMock Нисколько Знатьнить。из нескольких темизмоделированиеобъектначальствоизлюбойдействовать组合都可能导致问题и使тест失败

от OCMock 3.3 Для начала вам все равно понадобится один поток для вызова всех операций настройки и проверки, желательно основной поток запуска теста. но,Можетот多个нитьиспользоватьмоделированиеобъект。моделированиеобъектдаже Можетсуществоватьдругойизнитьсерединаиспользовать,При этом его настройка продолжается в основном потоке.

11. Дополнение

11.1、Синглтонизmock

не может быть напрямуюmockСинглтониз,вызоветmockконфликт。 Рекомендуемый способ записи:

Язык кода:javascript
копировать
// издеваться каждый раз alloc синглтон
id center = OCMPartialMock([[QLLoginCenter alloc] init]); 
// mock этоиз sharedInstance метод
OCMStub([[center classMethod] sharedInstance]).andReturn(center); 

ссылка:OCMock Demo:адрес GitHub

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