diff --git a/acceptance/openstack/compute/01-servers.go b/acceptance/openstack/compute/01-servers.go
deleted file mode 100644
index 40ad5ac..0000000
--- a/acceptance/openstack/compute/01-servers.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"github.com/rackspace/gophercloud/openstack/compute/servers"
-	"github.com/rackspace/gophercloud/openstack/identity"
-	"github.com/rackspace/gophercloud/openstack/utils"
-	"os"
-	"text/tabwriter"
-)
-
-func main() {
-	ao, err := utils.AuthOptions()
-	if err != nil {
-		panic(err)
-	}
-
-	a, err := identity.Authenticate(ao)
-	if err != nil {
-		panic(err)
-	}
-
-	sc, err := identity.GetServiceCatalog(a)
-	if err != nil {
-		panic(err)
-	}
-
-	eps, err := findAllComputeEndpoints(sc)
-	if err != nil {
-		panic(err)
-	}
-
-	w := new(tabwriter.Writer)
-	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
-	fmt.Fprintln(w, "ID\tRegion\tName\tIPv4\tIPv6\t")
-
-	region := os.Getenv("OS_REGION_NAME")
-	n := 0
-	for _, ep := range eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-
-		client := servers.NewClient(ep.PublicURL, a, ao)
-
-		listResults, err := servers.List(client)
-		if err != nil {
-			panic(err)
-		}
-
-		svrs, err := servers.GetServers(listResults)
-		if err != nil {
-			panic(err)
-		}
-
-		n = n + len(svrs)
-
-		for _, s := range svrs {
-			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", s.Id, s.Name, ep.Region, s.AccessIPv4, s.AccessIPv6)
-		}
-	}
-	w.Flush()
-	fmt.Printf("--------\n%d servers listed.\n", n)
-}
-
-func findAllComputeEndpoints(sc *identity.ServiceCatalog) ([]identity.Endpoint, error) {
-	ces, err := sc.CatalogEntries()
-	if err != nil {
-		return nil, err
-	}
-
-	for _, ce := range ces {
-		if ce.Type == "compute" {
-			return ce.Endpoints, nil
-		}
-	}
-
-	return nil, fmt.Errorf("Compute endpoint not found.")
-}
diff --git a/acceptance/openstack/compute/02-images.go b/acceptance/openstack/compute/02-images.go
deleted file mode 100644
index 8945434..0000000
--- a/acceptance/openstack/compute/02-images.go
+++ /dev/null
@@ -1,79 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"github.com/rackspace/gophercloud/openstack/compute/images"
-	"github.com/rackspace/gophercloud/openstack/identity"
-	"github.com/rackspace/gophercloud/openstack/utils"
-	"os"
-	"text/tabwriter"
-)
-
-func main() {
-	ao, err := utils.AuthOptions()
-	if err != nil {
-		panic(err)
-	}
-
-	a, err := identity.Authenticate(ao)
-	if err != nil {
-		panic(err)
-	}
-
-	sc, err := identity.GetServiceCatalog(a)
-	if err != nil {
-		panic(err)
-	}
-
-	eps, err := findAllComputeEndpoints(sc)
-	if err != nil {
-		panic(err)
-	}
-
-	w := new(tabwriter.Writer)
-	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
-	fmt.Fprintln(w, "ID\tRegion\tName\tStatus\tCreated\t")
-
-	region := os.Getenv("OS_REGION_NAME")
-	n := 0
-	for _, ep := range eps {
-		if (region != "") && (region != ep.Region) {
-			continue
-		}
-
-		client := images.NewClient(ep.PublicURL, a, ao)
-
-		listResults, err := images.List(client)
-		if err != nil {
-			panic(err)
-		}
-
-		imgs, err := images.GetImages(listResults)
-		if err != nil {
-			panic(err)
-		}
-
-		n = n + len(imgs)
-
-		for _, i := range imgs {
-			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", i.Id, ep.Region, i.Name, i.Status, i.Created)
-		}
-	}
-	w.Flush()
-	fmt.Printf("--------\n%d images listed.\n", n)
-}
-
-func findAllComputeEndpoints(sc *identity.ServiceCatalog) ([]identity.Endpoint, error) {
-	ces, err := sc.CatalogEntries()
-	if err != nil {
-		return nil, err
-	}
-
-	for _, ce := range ces {
-		if ce.Type == "compute" {
-			return ce.Endpoints, nil
-		}
-	}
-
-	return nil, fmt.Errorf("Compute endpoint not found.")
-}
diff --git a/acceptance/openstack/compute_test.go b/acceptance/openstack/compute_test.go
new file mode 100644
index 0000000..d44140b
--- /dev/null
+++ b/acceptance/openstack/compute_test.go
@@ -0,0 +1,148 @@
+package openstack
+
+import (
+	"testing"
+	"fmt"
+	"github.com/rackspace/gophercloud/openstack/compute/servers"
+	"github.com/rackspace/gophercloud/openstack/compute/images"
+	"github.com/rackspace/gophercloud/openstack/identity"
+	"github.com/rackspace/gophercloud/openstack/utils"
+	"os"
+	"text/tabwriter"
+)
+
+func TestListServers(t *testing.T) {
+	ao, err := utils.AuthOptions()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	a, err := identity.Authenticate(ao)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	sc, err := identity.GetServiceCatalog(a)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	eps, err := findAllComputeEndpoints(sc)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	w := new(tabwriter.Writer)
+	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
+	fmt.Fprintln(w, "ID\tRegion\tName\tIPv4\tIPv6\t")
+
+	region := os.Getenv("OS_REGION_NAME")
+	n := 0
+	for _, ep := range eps {
+		if (region != "") && (region != ep.Region) {
+			continue
+		}
+
+		client := servers.NewClient(ep.PublicURL, a, ao)
+
+		listResults, err := servers.List(client)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		svrs, err := servers.GetServers(listResults)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		n = n + len(svrs)
+
+		for _, s := range svrs {
+			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", s.Id, s.Name, ep.Region, s.AccessIPv4, s.AccessIPv6)
+		}
+	}
+	w.Flush()
+	fmt.Printf("--------\n%d servers listed.\n", n)
+}
+
+func findAllComputeEndpoints(sc *identity.ServiceCatalog) ([]identity.Endpoint, error) {
+	ces, err := sc.CatalogEntries()
+	if err != nil {
+		return nil, err
+	}
+
+	for _, ce := range ces {
+		if ce.Type == "compute" {
+			return ce.Endpoints, nil
+		}
+	}
+
+	return nil, fmt.Errorf("Compute endpoint not found.")
+}
+
+func TestListImages(t *testing.T) {
+	ao, err := utils.AuthOptions()
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	a, err := identity.Authenticate(ao)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	sc, err := identity.GetServiceCatalog(a)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	eps, err := findAllComputeEndpoints(sc)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+
+	w := new(tabwriter.Writer)
+	w.Init(os.Stdout, 2, 8, 2, ' ', 0)
+	fmt.Fprintln(w, "ID\tRegion\tName\tStatus\tCreated\t")
+
+	region := os.Getenv("OS_REGION_NAME")
+	n := 0
+	for _, ep := range eps {
+		if (region != "") && (region != ep.Region) {
+			continue
+		}
+
+		client := images.NewClient(ep.PublicURL, a, ao)
+
+		listResults, err := images.List(client)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		imgs, err := images.GetImages(listResults)
+		if err != nil {
+			t.Error(err)
+			return
+		}
+
+		n = n + len(imgs)
+
+		for _, i := range imgs {
+			fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t\n", i.Id, ep.Region, i.Name, i.Status, i.Created)
+		}
+	}
+	w.Flush()
+	fmt.Printf("--------\n%d images listed.\n", n)
+}
+
