Google App Engine:单元测试对memcache的并发访问

Phư*_*yễn 4 google-app-engine memcached

你们能告诉我一种在Google App Engine上模拟对memcache的并发访问的方法吗?我正在尝试使用LocalServiceTestHelpers和线程,但没有任何运气.每次我尝试在一个线程中访问Memcache,然后我收到此错误:

ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Increment()' was not found
Run Code Online (Sandbox Code Playgroud)

我猜GAE SDK的测试库试图模仿真实环境,因此只为一个线程(运行测试的线程)设置环境,这是其他线程无法看到的.

这是一段可以重现问题的代码

package org.seamoo.cache.memcacheImpl;

import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.MemcacheServiceFactory;
import com.google.appengine.tools.development.testing.LocalMemcacheServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

public class MemcacheTest {
 LocalServiceTestHelper helper;

 public MemcacheTest() {
  LocalMemcacheServiceTestConfig memcacheConfig = new LocalMemcacheServiceTestConfig();
  helper = new LocalServiceTestHelper(memcacheConfig);
 }

 /**
  * 
  */
 @BeforeMethod
 public void setUp() {
  helper.setUp();
 }

 /**
  * @see LocalServiceTest#tearDown()
  */
 @AfterMethod
 public void tearDown() {
  helper.tearDown();
 }

 @Test
 public void memcacheConcurrentAccess() throws InterruptedException {
  final MemcacheService service = MemcacheServiceFactory.getMemcacheService();
  Runnable runner = new Runnable() {

   @Override
   public void run() {
    // TODO Auto-generated method stub
    service.increment("test-key", 1L, 1L);
    try {
     Thread.sleep(200L);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    service.increment("test-key", 1L, 1L);
   }
  };

  Thread t1 = new Thread(runner);
  Thread t2 = new Thread(runner);
  t1.start();
  t2.start();
  while (t1.isAlive()) {
   Thread.sleep(100L);
  }
  Assert.assertEquals((Long) (service.get("test-key")), new Long(4L));
 }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*son 5

您是否尝试测试应用程序或App Engine的memcache实现?并发读写下的memcache的语义很好理解 - 你最好简单地模拟可能发生的条件,以验证你的应用程序处理它们.